"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。
CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perlの区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板:
http://pc11.2ch.net/php/ )
CGI の質問は答えが Perl と全然関係ない話に帰着する場合が
多かったりするので WEB プログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
http://www.perl.org/get.html ● 2010/02/19 現在の最新版: 5.10.1
▼ 前スレ
Perlについての質問箱 42箱目
http://pc12.2ch.net/test/read.cgi/tech/1257139591/ リンク集は
>>2-3 Perl 日本語処理の基礎の基礎
>>4 過去スレは
>>5-7 あたり
# [Perl 日本語処理の基礎の基礎] # このレスは、Windows の ActivePerl で日本語処理を行う場合のテンプレートです。 # このレスの内容をそのまま、UTF8 形式のソースファイルに保存して下さい。 # 入出力ともシフト JIS 形式のファイルまたは DOS 窓を想定しています。 # まず、以下の行を先頭に入れて下さい。 use utf8; use open IO => ":encoding(cp932)"; binmode STDIN => ":encoding(cp932)"; binmode STDOUT => ":encoding(cp932)"; binmode STDERR => ":encoding(cp932)"; # ※1 use Encode; # 次に、あなたが実行したい処理の内容を入れて下さい。 $file = 'C:/なんたら/かんたら.txt'; open my $fh, '<', encode("cp932", $file) or die $! ; # ※2 print <$fh>; # 以上の内容は、日本語処理が解らない人でも、とりあえず日本語処理ができてしまう # おまじないです。条件が異なる場合の対処方法は、ご自分で勉強して下さい。 # 【注】※1. の行を入れると、DOS 窓への日本語出力は簡便になりますが、 # ソースファイル名に非 ANSI 文字が含まれる場合に die 文の出力が失敗します。 # ※2. OS に渡す文字列(ファイル名,dos コマンドのオプションなど)は、 # この例のように cp932 でエンコードする必要があります。
1,1,4 1,2,7 1,3,2 という(X,Y,値)というメッシュ(グリッド)データがあって 例えば座標が1ごとに値があるのを、5毎にして今までの値を平均して入れるというのを組みたいのですが どうすればよいでしょうか? どう処理して良いかわからず困っています。
>>8 5ごとのメッシュを作っておいてそこにコピーする、というのは何となく思いついたんだけど、
「今までの値の平均」っていうのがよくわからんな。
eval { ... }; if (@_){ ... } って感じで例外処理できるっていろんなとこに書いてるけど、これがサブルーチンの中で既に@_の中埋まってたりする場合evalの最後でundef(@_)とかしなきゃいけないの? なんか他にいい方法ない?
11 :
8 :2010/02/21(日) 11:41:27
>>9 今までの値の平均というのは5ごとのメッシュにした場合そのメッシュには
(1,2),(1,3),(1,4),(1,5)(2,1)・・・・・(5,5)のそれぞれのメッシュの値の平均を入れたいんです。
この場合このメッシュは変換後(2,5、2,5)の座標となって上記の平均が値となるようにです。
>10 @_ じゃなくて $@ じゃないのか?
evalの前でlocal $@すればいいんじゃない
>>11 2.5×{1+INT(座標)}で変換すりゃいーんじゃないか
ごめん 座標÷5
二次元配列に入れてforでsum取って25で割るだけだろ?
18 :
8 :2010/02/21(日) 17:06:36
>>15 ,16
おお、座標の変換は出来そうですね。
あとはそれで値を平均していくというのができればいいのですね。
>>17 forでsumとって25で割るっていうのは値の平均ですよね?
二次元配列に入れるのは座標ですか?
Perlに二次元配列なんてねえよ リファンレスな
perldoc perllol より >If you want to get at a slice (part of a row) in a multidimensional >array, you’re going to have to do some fancy subscripting. That’s "multidimensional array" 確かに二次元って言葉は出て込ない(通常 Array of Array って書くから) >リファンレス ??
×Array of Array ◯Array of arrays
呼び方はかってだろうけれど、どっちにしろリファンレスを使ってた次元配列を実現しているのだから、同じこと
そうじゃなくて
そうじゃなくて何?
refanless
リ「ファレ」ンスだよ。
恥ずかしい
低レベル化、ここに極まれり。
前スレから、用語がどうとか本捨てろとか話の腰を折っては 自己満足してる初心者がいるな
30 :
デフォルトの名無しさん :2010/02/24(水) 16:02:17
if ($res->is_success && (!($recstr =~ /.+/) || $res->content =~ /$recstr/)) { service_set($v, $r, "up"); &ld_debug(2, "check_http: $$r{url} is up\n"); return $SERVICE_UP; } service_set($v, $r, "down"); &ld_debug(3, "Headers " . $res->headers->as_string); &ld_debug(2, "check_http: $$r{url} is down\n"); return $SERVICE_DOWN; こんなコードあるんだけど if ($res->is_success の箇所で Can't call method "is_success"って出てて処理が停止しちゃうんだけど とりあえず続行させるにはどうすればいいの?
削ればいいと思うよ。その後の動作は保証しないが。
32 :
30 :2010/02/24(水) 20:26:30
なんか{is_success}にしたらとりあえず大丈夫な気がしないでもないけど、 Perlってそもそも変数に原始性はもってないものなの? ECCメモリ使ってないせいなのかな?
その話を続けるつもりなら、CPAN モジュールならモジュール名を晒せよ。 じゃなきゃ、こっちが分かるわけないだろ。
36 :
デフォルトの名無しさん :2010/02/24(水) 22:55:42
とりあえずData::Dumperで$resの値を晒してもらうのがいいんじゃないか?
「Can't call method」って出てるのにデータ構造見せられてもね
どのパッケージにblessされてるかわかるだろ。もっともそれだけなら ref $resをprintするだけでいいけどな。
AUTOLOADが実行されてない時点で何かおかしいだろ
mooseでis => 'bare'して、自分でアクセサ書く時に、そのアクセサの中で型制約したい時はどうするの?
has 'hoge' => ( is => 'bare', isa => 'Foo', reader => '_get_hoge', writer => '_set_hoge' ); 最終的にhogeに値をセットするんなら最初にhogeに対して指定した制約(Foo)が適用されるんじゃないの? 俺が素人だからかもしれんが何がしたいのかよくわからん
use LWP;
新Perldocって死んだの? Googleグループもスパムが飛んでるし
47 :
デフォルトの名無しさん :2010/03/01(月) 02:48:27
requireで実行した処理に引数を送りつけるにはどうしたら良いでしょうか? requireで実行でなくても構わないんですが、 1: 実行中に外部から文字列 (フィル名と引数) を受け取る。 2: その文字列をrequireして返って来た内容を処理する。 と言うのがしたいのです。 コマンドとかではなくて、同じプロセス内で実行できたらいいなと思ってます。
48 :
47 :2010/03/01(月) 03:27:24
eval( qq[ local \@_ = @外部から受け取った引数\; \n] . $openで読んだファイル内容 ); とやるのはあまりに強引でしょうか?
>>46 あ、新PerldocJPだった
年末に空中分解したような感触を受けたんだけど
>49 分解以前に、始まってるようにも見えなかったが
貴重な生きてる板だから何かしようぜ
これからやろうぜ!って集まったけど年開けてみんな忙しくてはや3月って感じだろ
53 :
デフォルトの名無しさん :2010/03/03(水) 09:05:51
5.11使ってる人いる?
CPANTSってメンテ中?
>>53 12月に5.12が出ると思ったら難航しているみたいだから使っているよ、5.11.5を。
($var) = unpack(...) こんなかんじのコードがあるんですけど$varに括弧を付ける意味ってなんですか?
リストコンテキストになる
>>56 ありがとうございます。
ググってもうまく探せなかったので助かりました。
58 :
デフォルトの名無しさん :2010/03/04(木) 02:00:32
1〜1000の整数の先頭に0を付け加えて、4桁にしたい 1 →0001 100 →0100 1000→1000 s/〜/〜/; で一発で置換するには〜の部分はどう書けばいいですか?
スレ違い
sprintf 禁止なのかな。
全角だから工夫が必要かもね
Pythonでやればいいのに
Python厨
いやだからその部分だけPythonにやらせてPerlから呼び出せばいいじゃん そういう使い方ができるのがPythonなんんだから
print( substr("0000" . "1", -8, 8 ) . "\n"); print( substr("0000" . "100", -8, 8 ) . "\n"); print( substr("0000" . "1000", -8, 8 ) . "\n");
$str =~ tr/0-9/0-9/; my $formated_str = sprintf( %04d, $str ); $formated_str =~ tr/0-9/0-9/; 文字コードは書かれてないから知らん
use utf8; utf8::is_utf8($_) or die "死ね"; s{ (?<!\d) (\d{1,3}) (?!\d) }{ my $is_zenkaku = $1 =~ tr/0-9//; ( $is_zenkaku ? '0' : '0' ) x ( 4 - length $1 ) . $1; }egx;
なんかたまたま全角で書いてるだけだったりしてな・・・整数って書いてるし。 ということで俺は つsprintf
use utf8; $_ = "1〜1000の整数の先頭に0を付け加えて、4桁にしたい "; 1 while(s/(?<![0-9])([0-9]{1,3})(?![0-9])/0$1/g); 規制一時解除記念カキコ。
*{__PACKAGE__ . "p"} = \&CORE::print; p(); #=> Undefined subroutine &main::p called at - line 2. これは print 関数の厳密なエイリアスは作れないということでしょうか
>>70 作れないかどうかはわからないが、コードだけ見ると名前空間の::がないからでは?
*{__PACKAGE__."::p"}
72 :
デフォルトの名無しさん :2010/03/10(水) 12:16:30
#!/usr/bin/perl -w # perl のパスを指定 $send="00000000000\@docomo.ne.jp"; # デフォルト送信先 while (<>){ $content .= $_; m/^Content-Length: (\d+)$/; if ( m/^$/ ){ # 本文は調べない while (<STDIN>){ $content .= $_; } } } open(SENDMAIL,"|/usr/bin/sendmail $send"); print SENDMAIL $content; close(SENDMAIL); exit; Perlを勉強中で、上記を使って自分の携帯からメールを送りそのまま返信 (転送)するプログラムを作ろうとしています。 実際にメールを送るとサーバーには届いているのですが、返信をしてくれ ません。記述で間違っている箇所があれば教えてください。
とりあえず受信と送信一度に書くとどこに問題があるかわかりにくいので、 ・受信したメールを適当なファイルに格納するプログラム ・適当な内容のメールを送信するプログラム を別々に書くところからはじめるのをお勧めする。
perlの前にmailを勉強すべきかもしれない ちゃんとヘッダを作ってないのに /usr/bin/sendmail を 使うのはよくない。
sendmailは本当に/usr/binにあるのか?
76 :
72 :2010/03/11(木) 09:21:14
レスありがとうございました。いろいろ試してみて、.forwardを作り直したら 上手くいきました。記述は全然変えていないのですが、.plで作成してサーバー で変更をしていたのがよくなかったようです。 原因がわからず解決まで半日もかかってしまいましたorz 上のコードは社内でperlができる人のを真似たものでした。
続けてですみません。
私が作りたいと思っているプログラムが
「携帯Aから(絵文字などを含む)メールを受け取り、携帯Bに転送する」
というものなのですが、
>>72 で書いたコードではデコメは良いのですが
絵文字が全て〓に化けてしまいました。
サーバーで受け取った時点で〓に置換されてしまうので、送る各キャリ
アに合わせて文字コードを変換しなくてはならないとわかりました。
ttp://cgipon.specters.net/labo/it_emoji.htmlで紹介されているサン プルを試してみたりしているのですが、上手く変換してやることができ
ずにいます。 どのような方法を試してみればよいでしょうか?
〓に変換されたらもとが何の絵文字だったか知りようがないのでは?
SoftBankの絵文字に変換されてるって意味じゃないよな
>>77 > どのような方法を試してみればよいでしょうか?
どこが悪いのか突き止めて、そこを修正するといいよ。
バッチファイルに以下のように記述し、放り込んだファイルの名前に応じて
テキストファイルの一部を置換したいんですが、よく文字化けしてしまいます
>>4 を使ったplファイルを別途用意せず、バッチファイルへの記述だけで
文字化けに対応する方法はないでしょうか?
perl -pe s/"置換前文字列"/"置換後文字列"/ "置換前.txt" > "置換後.txt"
>>77 です。
>>78 全てを試したのではないのですが〓に変換されたのは、ほぼ全ての絵文字
でした。
>>79 SoftBankではないです、言われてみれば〓はSoftBankのロゴなんですね。
>>80 上記のサイトのサンプルの関数を通して変化しなかったので、他のサイト
を一生懸命探していました。
絵文字はこんなに難しかったのですね
>>81 perl -Mencoding=xxx かな。
PERLIOとかPERL_ENCODINGは効かないのか...
>>83 ありがとうございます
が、恥ずかしながらうまく使えません・・・
以下みたいなのとは根本的に使い方が違うんでしょうか?
perl -Mencoding=sjis -pe s/"置換前文字列"/"置換後文字列"/ "置換前.txt" > "置換後.txt"
実はsjisじゃなくてcp932ってオチだったりして
Encode::JP::Mobile; を使った経験のある方がいたら、教えてく下さい。 my $subject_encoded = is_imode($email_to) ? '=?SHIFT-JIS?B?' . MIME::Base64::encode_base64( encode( 'x-sjis-docomo', $subject ), '' ) . '?=' : is_softbank($email_to) ? '=?UTF-8?B?' . MIME::Base64::encode_base64( encode( 'x-utf8-softbank', $subject ), '' ) . '?=' : is_ezweb($email_to) ? encode( 'x-sjis-kddi-auto', $subject ) : '=?ISO-2022-JP?B?' . MIME::Base64::encode_base64( encode( 'iso-2022-jp', $subject ), '' ) . '?='; UTF-8文字列の$subjectを上記を使ってエンコードしたいのですが、文字 化けしてしまいます。Encode::Guessで確認するとasciiに変換されていま した。使い方に間違いがあるでしょうか?よろしくお願いします。
>>86 どの携帯キャリアの分岐だったのか、encode_base64を通す前が問題なのか
通した後が問題なのか、ぐらいは切り分けてから質問しろよ。
88 :
デフォルトの名無しさん :2010/03/16(火) 14:21:01
プログラムを組む際は use strict を最初に書いておく事といわれたので、 これをつけて.plファイルを実行すると、 下記のようなエラーが多く出ます。どう対応すればいいでしょうか_? use strict をつけないと特にエラーは出ません。 Global symbol "$xxxx" requires explicit package name at xxxx.cgi line 16.
>>88 「use strict を付けた状態でエラーにならないように書け」ってこと。
変数にmy付けてスコープを明確にせよ
90 :
デフォルトの名無しさん :2010/03/16(火) 15:10:35
>>87 不十分でした、すみません。
キャリアはdocomoなのでis_imodeの分岐を通っています。
encode_base64の前と後、どちらに問題があるのかつかめていない状
態です。
utf-8にデコードした文字列をそこに通すだけで良いのかと考えてしま
っていたのですが、使い方を間違っているようです。
絵文字について調べてEncode::JP::Mobileを見つける事ができたので
すが、携帯から受け取ったメールをそのまま返信するというコードに、
どう当てはめていけばよいのかわからずに苦戦中です。
使い方はそんなもんのような気がするので、入力段階で化けてそうだが。 単に化けたというんじゃなくて、具体的に$subjectがこれこれのときに 結果がこうなって化けてますというのを示して欲しい。
93 :
デフォルトの名無しさん :2010/03/16(火) 21:20:56
DBIx::Classについて質問です。 PostgresqlのXML型へ代入しようとするとエラーが出ます。 DBIx::Class::ResultSet::update_or_create(): DBI Exception: DBD::Pg::st execute failed: ERROR: operator does not exist: xml = unknown LINE 1: ...fo_id = $1 AND me.program_type_id = $2 AND me.res = $3 AND m... ^ HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. XML型への代入にキャストが必要だということはわかったのですが、 具体的にどうすればよいのか、ググってもマニュアル読んでも見つかりません。 賢い方、どうかご教示ください。
>>92 レスありがとうございます。
ttp://yanor.net/wiki/?%E6%90%BA%E5%B8%AF こちらのメール送信を参考にさせてもらっています。
my $email_to = '
[email protected] ';
MIME::WordDecoder->default(
MIME::WordDecoder->new([
'*' => sub{jcode(shift)->sjis},
]
)
);
#メール読み込み準備
my $parser = new MIME::Parser;
$parser->output_to_core(1);
$parser->tmp_recycling(1);
$parser->use_inner_files(1);
my $entity = $parser->parse(\*STDIN);
my $subject = decode('MIME-Header', $entity->head->get('Subject'));
上記のようにして$subjectを抜き出して、
>>86 を通しています。
このままですと、日本語は大丈夫で絵文字が全て〓となってしまいます。
だからどうやって処理してるかじゃなくて具体的にどういう $subjectの値がどう文字化けしたかを示せと。 俺の予想では「このプログラムに入る前から絵文字が 〓に置き換わっている」だけどなw
どんな絵文字かわからないけど、もし携帯で使うような絵文字のことなら文字コードで定義されてないんじゃない? 入出力結果はほしいね。
>>95 debugで確認して
「今日の天気は[雲の絵文字]です」が「莉頑律縺ョ螟ゥ豌励・縲薙〒縺・」
となっていました。
>俺の予想では「このプログラムに入る前から絵文字が
>〓に置き換わっている」だけどなw
受け取った段階で〓ということでしょうか?
こういうときは普通16進ダンプにするものだ。
99 :
デフォルトの名無しさん :2010/03/17(水) 12:58:07
cookie にメモを保存してやりたいんだけど、cookie のどの項目に保存してやればいい? このメモはクライアント側のメーカー名でこれは、CGIで取得できます。 この値をcookie に保存したいと考えています。 CGI::Cookie は理解しています。 1. expiration date 2. domain 3. path 4. secure flag とクッキーには項目がありますが、どのあたりにいれてやればいいでしょうか? また、具体的にどのように、セットすればいいでしょうか? また、 %cookies = fetch CGI::Cookie;とすることで、 ハッシュに格納できることは理解しております。
id=ID情報 memo=メモ内容 って普通に情報を記録すればいいんでないの?
102 :
デフォルトの名無しさん :2010/03/17(水) 13:51:05
>>101 thank you,
>id=ID情報
>memo=メモ内容
このあたり、もう少しソースコードも交えて教えてください
よろしくお願いします。
どうぞおググりください
105 :
デフォルトの名無しさん :2010/03/17(水) 14:39:40
>>104 Ty
>>
>> # Create new cookies and send them
>> $cookie1 = new CGI::Cookie(-name=>'ID',-value=>123456);
>> $cookie2 = new CGI::Cookie(-name=>'preferences',
>> -value=>{ font => Helvetica,
>> size => 12 }
このSYNOPSISでは、
# Create new cookies and send them
# fetch existing cookies
の2通りの例が示してあるのですね。
で新たにくっきを作るときが上のコードですね。
>>$cookie1 = new CGI::Cookie(-name=>'ID',-value=>123456);
これを
$cookie1 = new CGI::Cookie(-name=>'ID',-value=>123456,-memo=>めもしたいこと);
って感じにしてもいいのでしょうか?
pythonを主に使ってたのですが 他の言語がわかってる人向けのperlの教科書みたいのないですか?
全然違うから CGI::Cookie is object oriented. Each cookie object has a name and a value. The name is any scalar value. The value is any scalar or array value (associative arrays are also allowed).
>>105 実際に試してみたらいいんですよ
[14:58]% perl -MCGI::Cookie
new CGI::Cookie(-name=>'ID',-value=>123456,-memo=>めもしたいこと);
Unrecognized character \xE3 in column 51 at - line 1.
ほら、エラーになる。日本語のところでエラーになってる。
日本語をシングルクォートでくくっても、
[15:03]% perl -MCGI::Cookie -MData::Dumper
$cookie1 = new CGI::Cookie(-name=>'ID',-value=>123456,-memo=>'めもしたいこと');
warn Dumper $cookie1;
$VAR1 = bless( {
'value' => [
123456
],
'name' => 'ID',
'path' => '/'
}, 'CGI::Cookie' );
欲しい結果にはなってないと。って感じで自分で試さないとレス貰えないよ。
109 :
デフォルトの名無しさん :2010/03/17(水) 15:38:26
>>108 thanks Data::Dumper; こんな便利なモジュールがあるんですね、ありがとうございます。 >>[15:03]% perl -MCGI::Cookie -MData::Dumper このあたり、perl -M で二つのモジュールを指定してどのような処理を行いるかすこしわからないのですが調べてみます。
>>98 すみません、ダンプするにはどうしたらよいのでしょうか?
111 :
デフォルトの名無しさん :2010/03/17(水) 16:13:46
ttp://www.ietf.org/rfc/rfc2965.txt によりますと、クッキーの情報に関して、
>> set-cookie = "Set-Cookie2:" cookies
>> cookies = 1#cookie
>> cookie = NAME "=" VALUE *(";" set-cookie-av)
>> NAME = attr
>> VALUE = value
>> set-cookie-av = "Comment" "=" value
>> | "CommentURL" "=" <"> http_URL <">
>> | "Discard"
>> | "Domain" "=" value
>> | "Max-Age" "=" value
>> | "Path" "=" value
>> | "Port" [ "=" <"> portlist <"> ]
>> | "Secure"
>> | "Version" "=" 1*DIGIT
>> portlist = 1#portnum
>> portnum = 1*DIGIT
となっております。クッキーに関しては、
>>
ttp://www.thinkit.co.jp/free/article/0604/7/8/ を読みました。
>>101 のアドバイスによる、
>>id=ID情報
>>memo=メモ内容
>>って普通に情報を記録すればいいんでないの?
ですが、これは、どうも、new CGI::Cookie 内に書くところがないような気がします。
どこに書いてやればいいでしょうか?
アドバイスお願いします。
unpack("H*", $str);
>>111 >>108 の文章を読めばわかるはずだが、そのやり方ではできない。
WEBでサービスを利用してると、IDと一緒にパスワードも記録するってのはたまに見かけるでしょ?
>>101 はIDと一緒にメモを記録しておこうってだけだよ。
#!/usr/bin/perl
use strict;
use CGI qw/:standard/;
use CGI::Cookie;
# 記録
my $cookie1 = new CGI::Cookie(-name=>'id', -value=>"ID");
my $cookie2 = new CGI::Cookie(-name=>'memo', -value=>"MEMO");
print header(-cookie=>[$cookie1,$cookie2]);
# 読取
my %cookies = fetch CGI::Cookie;
my $id = exists $cookies{'id'} ? $cookies{'id'}->value : "none";
my $memo = exists $cookies{'memo'} ? $cookies{'memo'}->value : "none";
print "id: $id\n";
print "memo: $memo\n";
CGIとして実行すると、初回はnone、2回目以降はIDとMEMOが表示される。
>>112 レスありがとうございます。
早速unpackの使い方を調べて
@chr = unpack("H*", $subject);
print "@chr\n";
を試してみました。結果は空白です。やっぱり変な変換のされ方を
してしまっているのかもしれません。
115 :
デフォルトの名無しさん :2010/03/17(水) 17:05:22
>>112 ワイド文字列をunpack 'H*'に食わせると各文字の下位8bitしか
出てこないので、俺はこんな感じの自作サブルーチン
使ってる。
sub hexdump {
my($s) = @_;
$s =~ s/(.)/sprintf "[%x]", ord($1)/ge;
return $s
}
>>116 それは
>>86 のプログラムに食わす前の$subjectの値が空白だったということか?
そんなら〓はどっから出てくんだよ。なんかおかしくね?
>>117 >>86 を通る前の表示が記述ミスしていました。
「今日の天気は[雲の絵文字]です」が「cae56e29176f1367590a」となって
いて、同じ方法で
>>86 後の$subject_encodedをダンプすると空白になって
しまいました。
>>120 文字コードを調べたらUTF-8で3013は〓でした。perlを置くサーバーにメール
が届いた段階で〓に変えられているのでは、
>>86 を通しても…
〓にしないでメールを受け取る方法があるのでしょうか?
絵文字を〓に変換してるのは携帯キャリアのメル鯖。
>>121 gmailぐらいの交渉力があれば個別対応してもらえるけど、普通は
無理なんじゃないかなぁ。
>>122 >>123 まずは自社サーバーで〓に変換されていない状態で受け取れないと無理ですね。
同じようなプログラムに挑戦した方が結構いるのかと思っていました。
125 :
デフォルトの名無しさん :2010/03/18(木) 13:38:39
サーバー、クライアントがあります。 クライアントがサーバーに対して GET リクエストを出します。 この際、クライアントは、 GET xxxx HTTP/1.1 User-Agent:test1 とUser-Agent のヘッダを追加します。 つまり、クライアントからのリクエスには、上のUser-Agnet のヘッダが含まれています。 サーバー上のパールプログラムの中でで、このUser-Agent の test1 を変数として保持したいのですが、具体的な実装方法に ついてアドバイスをお願いします。
>>125 $ENV{HTTP_USER_AGENT}
127 :
デフォルトの名無しさん :2010/03/18(木) 14:10:35
128 :
デフォルトの名無しさん :2010/03/18(木) 14:35:34
>>125 ,128
板違い
>>126 みたいに板違いなのに回答するとこうやって図にのるのでみんなやめようね
130 :
デフォルトの名無しさん :2010/03/18(木) 16:00:44
133 :
デフォルトの名無しさん :2010/03/18(木) 16:07:58
初歩的な質問ですみません。 改行コードを変換したいんですが ・次行の先頭が 'A' で始まる場合のみ、行末の改行を削除 これを perl -pe 's/\nA//g' とやっても期待した結果になりません(全く完全に何も置換されない) 環境はCygwin1.7です。
Treat string as multiple lines
136 :
デフォルトの名無しさん :2010/03/19(金) 10:54:20
137 :
デフォルトの名無しさん :2010/03/19(金) 10:59:03
改行区切りで読み込んでるからだろ perl -p0e 's/\n(?=A)//g'
otsuneさんがウザくてamachangが爽やかなのはperlのせいですか?
はてなに帰れ
「処理済み」を表すフラグの変数名は何がいいですか?
done
ああ、それはいいな finishとかprocessedとか、どうもしっくり来なかった
144 :
デフォルトの名無しさん :2010/03/26(金) 13:04:37
plain array referenceって書いてあるんだから、ハッシュじゃだめだろ。 my @header = ('User-Agent' => 'test_Agent','Content-Type' => 'application/x-www-form-urlencoded'); my $header_ref = \@header;
エラーメッセージの行のまわりを見ればこうなっているわけだが。
if (ref($header) eq "ARRAY") {
$header =
HTTP::Headers- >new(@$header);
}
else {
$header = $header->clone;
}
148 :
デフォルトの名無しさん :2010/03/26(金) 13:50:13
レスありがとうございました。
解決いたしました。
>>145 オブジェクトを指定してうまく動作しました。
>>146 plain array reference を読み間違えておりました。配列であってハッシュではありませんでした。
>>147 アドバイス ありがとうございました。
perlから外部コマンドを実行して出力を格納するのに バッククオートを使用しているのですが、 コマンドの文字列に$を含むような場合(環境変数とか)に 変数として展開されないようにする方法ってありませんでしょうか。
$を適切にエスケープすりゃいいんじゃねーの? またはperlipc(1)の例にあるsafe backtick # add error processing as above $pid = open(KID_TO_READ, "−|"); if ($pid) { # parent while (<KID_TO_READ>) { # do something interesting } close(KID_TO_READ) || warn "kid exited $?"; } else { # child ($EUID, $EGID) = ($UID, $GID); # suid only exec($program, @options, @args) || die "can't exec program: $!"; # NOTREACHED }
お前らモダンPerlで書いてる? 俺はまだ勉強してないんだけど モダンPerlの利点って何があるのか簡潔に書け。
Perl4互換で書いてる。念のため
Mooseとかは使わないけどPerl4互換とか絶対あり得ないわw
自分で使うためのものしか考えてないから、5.10で追加されたものも普通に使って書いてる いまさらPerl4互換とかないわー
perl4ってどんなの? localとか使うん?
関数の引数は、localで受ける方が自然に見えるのは俺だけ? sub func { local($x, $y)=@_; まあ慣れなんだけど
おまえとKENTだけ
myだろ普通 JavaとかPHPとか他の言語は自動的に局所変数だ
最近は受ける変数名を考えるのが面倒だから $_[0]とかを直接使ってるw
pythonのctypesに相当するものはありますか?
ん?PythonってCのやり方に頼りだしたんだw
書き忘れた CPANでCtypeで検索しろ
swigしかないようです
Archive::Zipの解説しているWebPageないでしょうか。 できれば日本語で・・・ ぐぐっても、圧縮/解凍のやりかたしか出てない;;
>>166 すみませんでした。
具体的にやりたいのは、画像ファイルを無圧縮ZIPに固めておき、それを解凍せずにブラウザに表示したいのです。
ローカルファイルを開いたハンドルから表示するのは出来たので、
ZIP内のファイルのハンドルが取れれば、出来そうなのですが・・・
my $zip = Archive::Zip->new('test.zip');
my $fh = $zip->open('hoge.jpg');
みたいに出来たらな・・・と。
>>167 お望みの物はArchive::Zip::MemberReadかい
>>168 ありがとうございます。
早速調べて試してみたのですが、Not a GLOB reference のエラーが出ます。perl は初めてなので、なにか勘違いしていると思いますが、それがどこかわかりません。
#!/usr/bin/perl
use Archive::Zip;
use Archive::Zip::MemberRead;
$imgtype = 'jpeg';
#// file @
# open(IMG, "./1.jpg") or die;
#// zip A
$zip = Archive::Zip->new('./1.zip');
$IMG = Archive::Zip::MemberRead->new($zip, "1.jpg");
#// イメージ表示
binmode $IMG;
binmode STDOUT;
print "Content-type: image/$imgtype\n\n";
print while (<$IMG>);
#// 画像クローズ
close($IMG);
#// 終了
exit(0);
@を生かし、Aを殺すとうまくいきますが、逆だと binmode $IMG の箇所でNot a GLOB referenceとなります
Archive::Zip::MemberReadは中をのぞいてみたけど ハッシュをblessしただけの普通のオブジェクトだから ファイルハンドルとしては使えない。あくまで同じような メソッドが用意してあるだけの普通のオブジェクト。 binmodeとかはムリ。 IO::Stringみたいにグロブにtieしていろいろがんばれば なんとかなるけどそこまではやってないようです。
テンポラリに展開して、それを読み込んだほうが良さそうですね。 そういう方向で修正していって見ます。 わざわざ中をのぞいていただき、ありがとうございました。
ドキュメントぐらい読めよ関数名見りゃだいたい分かるだろ $zip->contents(FILENAME);
>>172 テンポラリファイルを使用する形で出来上がっていましたが、$zip->contents(FILENAME)を使用することで
「ファイルの書き込み→読み込み→出力」が、「ファイルの読み込み→出力」にすることが出来ました。
画像の縮小をさせるとレスポンスが遅いのですが、玄箱には重過ぎるのでしょう。
まだフロント(iアプリ)はテスト用でしか試してませんが、なんとか目処がつきました。
ありがとうございます。
Perlのバイブル本って何?
プログラミング言語Perl
正直最初にその1冊買ってそれが最後の本になるなw あとはCPANとかでいろいろ探しまくる作業が残りの半分。
>>175 どの本ですか?
アマゾンなどのリンクください。
プログラミング言語Perlマスターコース
プログラミングPerl
という本なら見つかるのですが
178 :
176 :2010/04/01(木) 17:43:19
ああ、俺が言ってるヤツは プログラミングPerl。 オライリーのらくだ絵の本。Perl開発者が書いたやつ。
モダンPerl読んだ方がいいと思う
それバイブルどころか入門書じゃないの?
プログラミングPerlって説明が古いじゃん
Effective Perlがいいぞ
モダンPerlはサスペンダーが大絶賛してたから意地でも読まない
江川達也さんは何の本でもたいしてちゃんと読まずに大絶賛するだろうが
モダンPerl読んだけど、情報がとびとびでさっぱり理解できない 初心者にすすめるもんじゃないよありゃ
プログラミングPerlは思想的に面白い。 Perl6なんて本当は完成させたくないんだよ。 綺麗すぎる言語は退屈だ。
Linux上で動かすPerlについて質問があります。 ファイルリストに記載されているファイルのみを 別のディレクトリにコピーしたいのですが、 どのようなコードを書けばよいのでしょうか? ファイルリストを読み込み、$file_listで1文字ずつ表示させる状態にして、 system("cp $file_list $dir_name");とやっているのですが、うまくいきません。
>>187 print `cp $file_list $dir_name`;
エラーがあるならこれで分かるんじゃないか
俺の予想では、chompするとうまくいく
俺が touch ';rm -fr /;' しといてやるぜw
>>187
blessしたオブジェクトをscalar($self)した時に 任意の文字列を返すにはどうすればよいでしょうか? 例えばDateTimeモジュールはDateTime->now()でオブジェクトを取得しますが、 scalar($now)すると現在時間が文字列で返ってくるのですが、 こういうのはどう実装すればよいでしょうか?
少なくともDateTimeではscalar使った時点で文字列に変わったりはしない print $now; とか my $datestr = "$now"; で文字列になることを言ってるんなら、overload
>191 use overload ( 略 '""' => '_stringify', 略
194 :
デフォルトの名無しさん :2010/04/10(土) 00:38:14
どうしても文字化けしてしまいます。 どなたかヒントでも頂けるとありがたいです。 WWW::Mechanize でCSVをダウンロードします。 その後print や Encode::decode などすると「Wide character ....」 と表示されました。 UTF8フラグが立っているのかと思い、Encode::encode("utf8",$data_str) などして、 ファイルを保存して開いてみると文字化けしてしまいます。 エディタはEmacsでエンコード指定して開き直したりもしてみました。 本当に試行錯誤して、encodeやdecodeのいろんな指定をしてみましたがダメでした。 しかしブラウザからCSVをダウンロードするとエクセルできちんと開きますし、 Emacs で UTF-8 で開くことが出来ます。 正直、分かりません・・・。
Encode::from_to($data_str, "utf8", "cp932");
>>194 わかってないなら弾の言う通りに書けよ。
197 :
194 :2010/04/10(土) 02:00:29
単純にdos窓で表示できない、と言う訳ではありません。Emacsで開いているので。 ブラウザで落とすとUTF8になっているので、ファイルはUTF8なんだと思うんですが。。 Mechanizeのcontent には独特なエンコードルールが有るんでしょうか? contentのデータをencodeするのがマズイのかな。
文字化けとかUTF8と思うとか曖昧なこと言わないで バイナリエディタで中身見ればいいのに
>ファイルはUTF8なんだと思うんですが。 思うってなんだそりゃw 自分で見てから判断しれよ
>>194 とりあえずDevel::Peekなりでdumpしてutf8flagが立ってるかどうかをちゃんと確認した方がいい。
曖昧なまんまの推測だと答えも推測になるからなかなか答えにたどり着かんよ
Spidering Hacksに載ってたな
Spidering Hacksの内容は今となってはさすがに古過ぎる スクレイピングのマナーとか心構えとかは参考になるけどな
205 :
デフォルトの名無しさん :2010/04/14(水) 19:52:51
もう5年以上前になると思いますが、 Perlで書かれたプログラムを実行するとラクダの形で文字列が出力され、 そのプログラム自体もラクダの形に揃えられていたものをみたのですが、 探してみてもなかなかみつかりません。 少ない情報ですが、お分かりの方はいませんでしょうか?
Acme::EyeDropsじゃねーの
>>207 use URI;
sub omiturl {
my $uri = URI->new(shift);
my $maxlen = shift;
my $repl_q = quotemeta(my $repl = "...");
my $path = $uri->path;
until (length "$uri" <= $maxlen) {
$path =~ s,\A/(?:$repl_q/)?[^/]+,/$repl, or last;
$uri->path($path);
}
return "$uri";
}
手っ取り早くURI使ってるから$replに半角スペースとか使うと%20にされちゃうんで、
そのへん気に入らなかったら適当に直してくれ
>>208 便利につかわさせて頂きます。
ありがとうございました。
localhost/p2/read.php?host=pc12.2ch.net&bbs=tech&key=1266565626&ls=208-#r208
のようなクエリ文字列 or フラグメントの長いURLを
>>208 に通すと無限ループするな
見た感じだとマッチしなくなった時点でループを抜けるように書かれてると思うけど、なぜだろう
マッチもしないし文字数もこれ以上短く出来なくなったら無限ループだな。 例えば文字の長さを10とかやったら絶対無限ループ
212 :
208 :2010/04/16(金) 10:08:30
oh…やっちまった……テストはちゃんと書きましょうってことだな…
untilを↓に差し替えで無限ループは回避できるはず。
>>207 がまだ見てることを祈る…
for (my $i = 0; length "$uri" > $maxlen and $i < 20; $i++) { # ループ20回で強制的に抜ける
$path =~ s,\A(/(?:$repl_q/)?[^/]+),/$repl, or last;
last if $path eq $1; # マッチするが置換しても内容が変わらない場合抜ける
$uri->path($path);
}
Cだと static char hoge[128]; write(fd, hoge, 128); とすれば128バイト分の0x00が書き込まれると思うのですが perlだとどのように記述すればいいでしょうか?
print 0x00 x 128;
あ、ごめん "\x00" x 128 だ
配列の任意の位置に要素を入れるにはどうすればいいのでしょうか? my @arr = qw(a b c d e); my $i = 3; ??? add_elem @arr, $i, "z"; print "@arr"; #=> a b c z d e
218 :
208 :2010/04/17(土) 17:34:11
splice @arr, $i, 0, "z";
220 :
デフォルトの名無しさん :2010/04/21(水) 18:25:44
require HOGE::FUGA; を require $foo; みたいにして、 HOGE::FUGAの代わりにHOGE::PIYOを読むように動的に変更したいのですが、 この場合'HOGE/FUGA.pm'ってパス指定しないとうまくいきません。 出来ればHOGE::PIYOのような形式で指定したいのですが、 上手い方法はないでしょうか?
221 :
デフォルトの名無しさん :2010/04/21(水) 18:26:35
なるほど、evalの中でrequireするか、でなければUNIVERSAL::require使えばよいのか。
222 :
デフォルトの名無しさん :2010/04/22(木) 00:53:15
対数計算した座標渡せばいいだけでは
それだとグラフ自体は意図通りに描画されるかも試練が 軸の目盛り(?)が意図したようにならんのでは?
じゃあ使うのやめれば
226 :
224 :2010/04/22(木) 11:20:42
おれは使ってないぞw
227 :
デフォルトの名無しさん :2010/04/22(木) 19:34:23
>>223 レスありがとうございます。
描画はそれでいけますが素直にgnuplotのほうが無難かな。
データだけ吐いてR言語がいいぞ
229 :
194 :2010/04/22(木) 23:50:50
文字化け use strict; use warnings; use utf8; use Encode; use Net::Delicious; my $delicious = Net::Delicious->new({user=>'hoge',pswd=>'fuga'}); my $agent = LWP::UserAgent->new; foreach my $bookmark ( $delicious->recent_posts ) { my $url = $bookmark->url(); print utf8::is_utf8($bookmark->description) . "\n"; my $title = Encode::encode('utf8',$bookmark->description); my $tags = Encode::encode('utf8',$bookmark->tags); $tags =~ s/([^ ] )/#$1/g; print $title . "\n"; print $tags . "\n"; print "---------------------------------------------\n"; } 上のようなスクリプトをかきましたが、descriptionが文字化けしてしまいます。 Net::Delicious からとったデータはutfフラグがたっていたので、そのままencodeしました。 UTFフラグがたったものをencodeして文字化けする場合はどのように対処すれば良いでしょうか?
>>229 試してみたけど文字化けしないな
使い方も問題なさそうだけど
>>229 cpan moduleがencodeに対応してたりしてなかったりするものを混ぜると
わけわかんなくなる場合がある。
関係してそうなmoduleかたっぱしからupdateしてみ
package TestC; sub new{ my $class = shift; my $self = { a => [], }; return bless $self, $class; } ---- my $c1 = new TestC; my $c2 = new TestC; としたときに $c1 と $c2 の a が同じものになってしまいます。 ($c1 で編集すると $c2 も同じになる) インスタンスごとに配列も別の実態を参照してほしいのですがどうすればよいでしょうか?
普通ならないけどな。編集して同じになったというのが わかるソースも出せよ。 package TestC; sub new{ my $class = shift; my $self = { a => [], }; return bless $self, $class; } package main; $c1->{a}->[0] = 100; printf "c1: %d, c2: %d\n", $c1->{a}->[0], $c2->{a}->[0]; すくなくとも上記で試した限りでは結果は c1: 100, c2: 0 だった。
>>232 別物みたいだけど?
package main;
my $c1 = new TestC;
my $c2 = new TestC;
warn '$c1->{a} and $c1->{a}: ' . is_equal($c1->{a}, $c1->{a});
warn '$c1->{a} and $c2->{a}: ' . is_equal($c1->{a}, $c2->{a});
sub is_equal {
my($x, $y) = @_;
($x eq $y) ? 1 : 0;
}
package TestC;
sub new{
my $class = shift;
my $self = {
a => [],
};
return bless $self, $class;
}
1;
====================
$c1->{a} and $c1->{a}: 1
$c1->{a} and $c2->{a}: 0
235 :
232 :2010/04/23(金) 17:05:46
>>233 すいません、長くなりそうなのではしょってしまいました。
以下を実行すると
c1 2
c2 2
と表示されます。@5.10.0
package TestC;
####new省略
sub push_array{
my $self = shift;
my $a = $self->{a};
push @a, $_[0];
}
sub get_count{
my $self = shift;
my $a = $self->{a};
return @a;
}
package main;
my $c1 = new TestC;
my $c2 = new TestC;
$c1->push_array(1);
$c2->push_array(2);
print "c1 ".$c1->get_count."\n";
print "c2 ".$c2->get_count."\n";
use strictしなかった結果がこれだよ!
$a!
$a ≠ @a
$aと@aは全くの別物。このプログラムに登場する@aはmyで宣言されてない から常に同じパッケージ変数が使われてる あと$a, $bはsortが使う特別な変数なのでそれ以外の用途で使うとろくな目に 会わないからやめとけ。
$a使った結果がこれだよ!
sortが$a, $bを使うという仕様を見た時は目ん玉飛び出たな どんな糞仕様だよと
どこが? Perlなら妥当な仕様だろ。
$_ とか $@ とか $! とかも糞仕様
つまりPerlは糞言語だから糞仕様なのがむしろ妥当だと
$aと$bをどう使うと降順になるのか何度やっても覚えない そもそも、降順と昇順の意味がピンと来ない
246 :
232 :2010/04/23(金) 22:44:39
返答が遅くなり申し訳ありません。 色々と得心がいきました。 解決したところで引き続き頭をこねこねしたいと思います。 ありがとうございました。
$_やら$@やら$!はだれがプログラムしても同じ変数だから分かりやすい っていう話があってだな
>>247 なるほど
そう考えると確かにと思わざるを得ない
ただあまり使わない特殊変数は検索かけても引っかかってこないのがウザい
perldoc perlvar
UTF-8 で書かれたテキストファイル hoge.txt の内容を Windowsのバッチファイルからワンライナーで msg="おはよう" から msg=こんにちは に置換したいんですが・・・ perl -i.BAK -pe "s/(?<=msg=).*/こんにちは/" hoge.txt これだとシフトJISで書き込まれてしまうんです。 UTF-8 で書き込む方法があれば教えてください。
見つけたよ特殊変数のスレ
同じプログラム板じゃないか
Perlの特殊変数は氏ね。絶対に使うな。可読性下がる
http://pc12.2ch.net/test/read.cgi/tech/1141988910/34 34 名前:デフォルトの名無しさん[sage] 投稿日:2006/03/11(土) 22:02:24
特殊変数は、他人や「昔の自分」が書いたソースに出てきても
まったく可読性に影響の無い、数少ない構成要素の一つだろう。
同じ名前の変数には、常に同じ意味を持つものが入ってるんだから。
「これ何のためにあるの?何が入ってるの?」って状態になるのは普通の変数のほう。
>>251 文字コードがsjisであれば、
perl -i.BAK -pe -MEncode "s/(?<=msg=).*/Encode::from_to('こんにちは','sjis','utf8')/e" hoge.txt
>>252 可読性とか書きようによってはいくらでも良くなるし悪くもなるもんなのに、言語仕様のせいにするのはおかしいよね。
他の言語から見れば、Perlは変数の前に$@%*とか使ったり、特殊変数の意味が理解できないだろうから気持ち悪く映るんだろうけど。
$@%があるからスカラなのか配列なのか、分かりやすくて良いと思う俺って少数派?
多数派
じゃあリファレンスも別のプリフィクスを採用するべきだったよね あと配列もハッシュも中身にアクセスするとき$プリフィクスを要求するのは分かりにくいよね(これはperl6で変更になるけど)
あれはあれでいいんだよ
258 :
194 :2010/04/24(土) 20:59:32
>>231 ,230
Macだといけました。
Windowsだと化けるんだな。。
ppmのモジュールは確かに古かったから、cpanで入れ直してみようかと思います。
ちなみにeshellで出力してるので、winでもcp932にencodeしなくても大丈夫です。
てかこれで途中までは日本語がきちんと表示されます。
>>256 おれはperl5の方が好きだ
スカラだから$で統一されててわかりやすい
最終的に得るものがスカラ、という考え方か 例えばデリファレンスで配列を得たけりゃ@$array_refだし 確かにそりゃそうだなぁ
あれだよな。@は配列変数 って書くサイトや本が悪いよな。 配列へのアクセスなのに。
>>260 そういう思想で作ってあるって習ったから覚えやすかった
@names = ('OZA-', 'POPPO', 'MASZOE'); @mes = ('012345678901234567890123456789', 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほ', いいいいい); 例えばこのようなものを、次のように2つのカラムがあるかのように出力したいのですが、どうしたらできるでしょうか? OZA- .| 012345678901234567890123 ...| 456789 POPPO | あいうえおかきくけこさしすせそたちつてとなにぬ ...| ねのはひふへほ MASZOE .| いいいいい こんなのでできるかなと思ったのですが無理でした… format AAA = @<<<<<<<<<< | @<<<<<<<<<<<<<<<<<<<< ~~ | @<<<<<<<<<<<<<<<<<<<< . よろしくお願いします。
と思ったらformatでできました。お騒がせしました。
>>253 ありがとうございます。すごい勉強になります。
> perl -MEncode -i.BAK -pe "s/(?<=msg=).*/Encode::from_to('こんにちは','sjis','utf8')/e" hoge.txt
だと Modification of a read-only value attempted at C:/Perl/lib/Encode.pm line 195, <> line 280. って叱られるので
perl -MEncode -i.BAK -pe "s/(?<=msg=).*/$s='こんにちは';Encode::from_to($s,'sjis','utf8');$s/e" hoge.txt
でできました!
Jcode使えば少し短くなりました
perl -MJcode -i.BAK -pe "s/(?<=msg=).*/Jcode->new('こんにちは','sjis')->utf8/e" hoge.txt
Perlの特殊変数って言っても、使うのは $_ $@ @_ とかほとんどこんなもんだろ。全部覚えてる奴なんてまずいない。
最低限:$_ @_ $1〜$9 $a $b 覚えてると便利:$@ $! $. $/ $? $$ ゴルフやるなら:$\ $, $" $& $` $' @F
268 :
デフォルトの名無しさん :2010/04/26(月) 21:46:22
open IN,"file"; while(<IN>){ $str .= $_; } file内のテキスト全てを、$strというスカラー変数に代入してみました。 ファイルサイズが小さければ問題ないが何万行とかだと代入処理に失敗しますよね?
そういえば数値はスカラに2^1023以上、2^1024未満が入ったけど、 このヘンの上限というか仕様ってどこか載ってます?
>>268 open IN,"file";
read IN,$str,-s IN;
use File::Slurp;
$str = read_file('filename');
>>268 メモリあれば大丈夫だよ。ただ毎行 .= すると遅い
273 :
デフォルトの名無しさん :2010/04/27(火) 17:40:54
教えてエロい人 perlはいつからスカラの要素を参照するときに@で参照できるようになったんだ? my @sca = (1,2,3); print $sca[1]; // OK... print @sca[1]; // OK?! @sca[1] = 'x'; print @sca[1]; // OK?!?!
>>273 それスカラじゃなくてたまたま1要素の配列スライス。
配列スライス自体はperl4の昔からすでにあった。
それより前はシラネ
my @sca = (1,2,3); @sca[0..2] = "a".."c"; print @sca[0..2], "\n", @sca[0, 2], "\n", @sca[0];
276 :
273 :2010/04/27(火) 18:08:51
xpでactiveperl v5.8.9を使ってたら、 使えてたスクリプトが急に「問題が発生したため」云々のウィンドウを出して止まるようになった ファイルが12728あるディレクトリでreaddirをしたのが原因みたい ファイルの少ないところで使うと問題ない なんか制限あったっけ
違った 260文字あるファイル名のせいだった
Perl/Tkで作ったテキストウィジェットに1秒置きに1-10の数字を表示させるにはどうすれば良いですか?
バッチファイル(hoge.bat)の1行目に PATH C:\hage;%PATH% と「挿入」したいんですけど、 ワンライナーでできますか? できるならやり方を教えてください。
open BAT '>hoge.bat'; print BAT 'PATH C:\hage;%PATH%';print BAT <BAT>; こんな感じ?
愚直に perl -e "open my $FH,'<','hoge.bat';my @l=<$FH>;close $FH;open $FH,'>','hoge.bat';print $FH \"PATH C:\\hage;\%PATH\%\n\",@l;"
perl -p0i -e 's/^/PATH C:\\hage;%PATH%\n/' hoge.bat Windowsだとシングルクオートじゃなくてダブルクオートじゃないとだめなんだっけか でもこのままやると%PATH%が展開されちゃったりするのか?よくわからんから適当に直してくれ
>>284 できました!ありがとう。
perl -i.BAK -p0 -e "s/^/PATH C:\\hage;%%PATH%%\n/" hoge.bat
perlのスクリプトを含むWindowsのパッケージを setup.exe みたいな塊にまとめたいのですが 何がおすすめでしょうか? 昔単なる実行ファイルだけのときは innoSetup使ってたけど
PAL Perl2EXE
関数の命名でヒントください 「array化」を英語で書くとしたら 「arraylize」「arrailise」「arrailize」、 どれにしたらよいでしょうか? テキストを読みこんで、それを配列に格納する というありふれた機能を持つ関数の名前です 下のように使っています my @list = arraylize ( "list.dat" ) ; sub arraylize { my $name = $_[0] ; open ( FH ,"< $name" ) ; my @listArray = <FH> ; close (FH) ; return @listArray ; } 他にも、もっと語呂のいい名前があったら教えてください それ以前に、同じような動作をするものがあったら知りたいです
いきなりファイル名でというのは知らないけど、強いて言えば IO::Handleのgetlinesが近いかなぁ。 本題とは関係ないが、せめてopenのエラー処理( or die $! をつける程度でいいよ)はやっとけ。後で苦労するぞ。
「ファイルを読み込んで配列を返す」処理につける名前にしちゃ arraylize は筋が悪いな readfile なり readlines なりでいいだろ どうしても array が重要だっつーんなら make_array
まんまでいいなら、file2array
sub arraylize { my $name = shift ; open ( my $fh ,"<", $name ) ; my @listArray = <$fh> ; close ($fh) ; return @listArray ; } 関係ないけど
>「arraylize」「arrailise」「arrailize」 l はどっから出てきたんだよ
セパレータが指定されたら split した配列を返したり、 配列だったらそのまま返したり、 ハッシュだったら key/value をセパレータで繋げた配列を返したり・・・ そこまでやって、初めて arraylize を名乗っていい。 そう思うんだ。 どうでもいいけど
to_arrayじゃダメなん?
ありがとうございます 単純にfile2arrayにします エラー処理や ファイルハンドルに$fh、 そこのところ貰います
my %tmp; @tmp{qw(foo bar baz)} = split(/,/, $_, 3); push(@result, \%tmp); みたいなコードがあるんですが、これを %tmp を使わずに一行で済ます書き方ってあるでしょうか。 mapあたりでできそうなんだけど思いつかない… (foo, bar, baz, 1, 2, 3) なリストを (foo, 1, bar, 2, baz, 3) に変換する関数があればいいんだけど。
>>288 わざわざ作らんで
use File::Slurp;
my @list = read_file("list.dat");
しなよ。
>>297 > (foo, bar, baz, 1, 2, 3) なリストを (foo, 1, bar, 2, baz, 3) に変換する関数があればいいんだけど。
List::MoreUtilsになにかあるんじゃ
perl -e "print ((qw(foo bar baz),split(/,/, 'xxx,yyy,zzz'))[map{$_,$_+3}(0..2)]); fooxxxbaryyybazzzz あんまやるもんじゃないな
頭がおかしくなりそうだ TMTOWTDIと言うけど、杉樽歯泳場猿画五都市と言う名言もあるし
>>297 use List::MoreUtils qw(zip);
$_ = '1,2,3';
push @result, {zip @{[qw(foo bar baz)]}, @{[split /,/, $_, 3]}};
>>299 おお! と思って List::MoreUtils の pairwise や mesh が使えるかと思って試してみました。
が、一旦変数に入れないとARRAYとして解釈してくれずダメでした…
#NG
print mesh qw(foo bar baz), (split(/,/, "1,2,3")); # compilation errors
#OK
my @array1 = qw(foo bar baz);
my @array2 = split(/,/, "1,2,3");
print mesh @array1, @array2;
>>302 入れ違いになりました。
素晴らしい。使わせていただきます。ありがとうございます。
>>297 >(foo, bar, baz, 1, 2, 3) なリストを (foo, 1, bar, 2, baz, 3) に変換する関数があればいいんだけど。
変数一つ作っていいならこんな関数かな
my @arr = ('foo', 'bar', 'baz', 1, 2, 3);
my $half = $#arr / 2;
my @result = map { +($arr[$_], $arr[$_ + $half + 1]) } (0 .. $half);
>>302 いったん無名配列への参照[]にして
それを@{}で、参照先の配列に戻して渡している
という理解でいいのかな?
perl -e "print join',', map{(qw(foo bar baz))[$_],(split /,/, 'xxx,yyy,zzz')[$_]}(0..999);#十分に大きい値
foo,xxx,bar,yyy,baz,zzz
>>300 よりはマシかなあ…
>>305 sub zip{ map { $_, shift @{$_[1]} } @{$_[0]} }
print zip [1,2,3],[4,5,6] ;
perl -e '@array = qw/xxx yyy zzz 1 2 3/; print map { $array[$_] => $array[$_ + @array / 2] } (0..($#array / 2));'
TwitterのAPI叩くにはどうすればいいですか Net::Twitterとかじゃなくて、純粋にHTTP使ってその辺から学習したいのです
use Net::Twitter; 役にたたなかった
319 :
デフォルトの名無しさん :2010/05/11(火) 00:00:10
Perlのファイル読み込みと配列格納について質問があります。 エクセルから出力した行列状態になっているcvsファイルをPerlに読み込ませて、 @a、@b、@cにそれぞれの行のデータを格納したいです。 なので、二次元配列のようなことをしないといけないと思うのですが、 Perlで二次元配列のような処理をするにはどうすればよいのでしょうか? また行列状態になっているファイルを配列に格納する他の良い方法はありますでしょうか? よろしくお願いします。
320 :
319 :2010/05/11(火) 00:14:07
追記です。このような内容のファイルを扱っています。 1 Takehara Shinji 500 600 1300 2 Hatakeyama Takanori 569 795 1560 3 Kouki Kameda 785 889 2695 4 Daiki Kameda 758 784 9000 5 Tomoki Kameda 580 120 984 そして、左から4行目〜6行目にある数値を縦に、 @a、@b、@cに格納し、 $a[0] を参照すると、500 $a[1] を参照すると、569 $b[0] を参照すると、600 $b[1] を参照すると、795 $c[0] を参照すると、1300 $c[1] を参照すると、1560 といった具合にしたいです。
>>319 ・「perl 配列の配列」でググる
・「perl CSV」でググる
>>320 1 #! /usr/bin/perl
2
3 use strict;
4
5 my(@data, @array);
6 @data = (
7 '1 Takehara Shinji 500 600 1300',
8 '2 Hatakeyama Takanori 569 795 1560',
9 '3 Kouki Kameda 785 889 2695',
10 '4 Daiki Kameda 758 784 9000',
11 '5 Tomoki Kameda 580 120 984',
12 );
13
14 foreach(@data){
15 push(@array, [@{[split(/\s+/, $_)]}[3..5]]);
16 }
17
18 local $\ = "\n";
19
20 print $array[0][0]; #=> 500
21 print $array[1][0]; #=> 569
22 print $array[0][1]; #=> 600
23 print $array[1][1]; #=> 795
24 print $array[0][2]; #=> 1300
25 print $array[1][2]; #=> 1560
323 :
デフォルトの名無しさん :2010/05/11(火) 01:17:33
>>322 ありがとうございます。
外部からファイルを読み込む場合はどうすればよいのでしょうか?
324 :
321 :2010/05/11(火) 01:45:17
>>323 use IO::File;
my @data = IO::File->new('data.txt', 'r')->getlines;
chomp @data;
use File::Slurp; my @csv = read_file('hoge.csv'); chomp @csv;
>>322 [@{[split(/\s+/, $_)]}[3..5]]
は
[(split /\s+/, $_)[3..5]]
のほうがいいよね。この場合に限れば /\s+/, $_ が無くてもよし。
つーかCSVなら最初からText::CSV(_XS)?使えばいいじゃんって話だけど。
>>328 おお、/\s/まで省略できるのか
初めて知った
ありがt
$_ = " foo\nbar\tbaz" としたとき、 split(/\s+/) だと ('', 'foo', 'bar', 'baz') が返るけど、 引数なしのsplit または split(" ") なら ('foo', 'bar', 'baz') になるってことだけ注意な。
HTTP通信するにはなんていうライブラリつかえばいいの
socks
えっ?
LWP
コードポイントからその文字を出力したいです。 #!/usr/bin/perl use strict; use utf8; use Encode; use Encode::Guess; my $cp = "4FAE"; # 「侮」のコードポイント my $packed = pack("S", $cp); my $decoded = decode("utf-16be", $packed); print $decoded, "\n"; my $decoded = decode("utf-16le", $packed); print $decoded, "\n"; できないです。
pack("U", 0x4FAE) じゃだめなのか
0x4FAE または hex("4FAE") または "20398"
#!/usr/bin/perl use strict; use utf8; use Encode; use Encode::Guess; my $cp = "4FAE"; # 「侮」のコードポイント my $packed = pack("U", hex($cp)); print $packed, "\n"; ありがとうできました。でもwarningがでます。 $ perl cptest2.pl Wide character in print at cptest2.pl line 9. 侮 $
16進文字列からバイト列への変換が間違ってるな。 pack("S", $cp)じゃなくてpack("H*", $cp)だろ。
>>338 wide characterをいきなりprintするとそうなる。
encodeしてバイト文字列にしてからprintするか、
printする前に文字コード指定してレイヤつけとけ。
binmode STDOUT, ':encoding(utf-8)';
binmodeつけたら直りました。 ありがとうです。
343 :
デフォルトの名無しさん :2010/05/14(金) 13:21:02
文字のバイトコードを得るほうほうを教えてください! たとえば、a から 97 を得るようなことってできますか??
ord("a")
345 :
デフォルトの名無しさん :2010/05/14(金) 13:26:10
ありがとう!
346 :
デフォルトの名無しさん :2010/05/15(土) 03:08:54
perlで文字をprint等で出力するとき、特定の行で改行をして出力するというようなことってできますか?
できるよ安心して
何だよ「特定の行」って
質問の意図するところが分からない。このうちのどれか? use strict; use warnings; print "is\nthis\nunko?\n"; use strict; use warnings; print << "END_OF_UNKO"; this is unko! END_OF_UNKO use strict; use warnings; use HTML::Template; my $what_is_this = join "", <DATA>; my $t = HTML::Template->new( scalarref => \$what_is_this ); $t->param('var', "was"); print $t->output; __DATA__ this <TMPL_VAR name="var"> unko!
>>348 use IO::File;
my $fh = IO::File->new('hoge.txt', 'r');
while(my $line = $fh->getline){
print $line;
print "\n" if $line =~ /hoge/;
}
こんな漢字?
$. == 行番号 とか。
353 :
デフォルトの名無しさん :2010/05/15(土) 11:21:19
perlで作った掲示板の連続投稿を制限する方法を教えてください。 一定時間が経過するまで再投稿できないようにしたいです。
投稿者のIDに対して最後の投稿時間を記録する
小規模ならグローバルでもいいんじゃないの? # 30秒経過してない場合returnする return if $g_last_post + 30 > time; $g_last_post = time;
>>353 IPのログはとってんだろ?
そこから判定すりゃいい
samba24みたいな手にするって方法もあるな
ちょっと技術がいるかも知れないが
普通はそんなめんどいことしないでクッキー食わせて判定だと思うぜ
ログは巨大だからなあ 自前でテーブル持つ方が軽い
いやだから普通はクッキーだろっての
↑バカは喋るな
>>359 クライアントが書き込み後にクッキー捨てたらアウトだと思うんだがそうでもないのか
もうちょっと詳しく
362 :
デフォルトの名無しさん :2010/05/15(土) 16:01:51
>>349-352 長いテキストがあり、100文字目ごとに改行を入れるということです。
分かりにくくて申し訳ありませんでした。
2chもクッキーだな
366 :
デフォルトの名無しさん :2010/05/16(日) 21:25:10
funcA(); if(hoge){ funcAErr(); } else { funcB(); if(fuga){ funcBErr(); } else { funcC(); if(fuga){ resultA(); } else{ resultB(); } } } こんな感じで事前処理にこけたら弾き、を繰り返して最後の処理で結果Aか結果Bのいずれかを返す、 と言ったコードがあるんですが、これをもっとPerlらしくシンプルに書きたいんだがどう書けばいいだろう……。 (ifネストが実際には3階層ではなく20階層くらいあります)
>>366 funcA() や funcB() の戻り値は無いのかとか、hoge や fuga が何を判定してるのかとか、
funcAErr() でなく funcErr('A') じゃダメなのかとか、エラー処理後に戻ってくる (if then else
で括る) 必要があるのかとか、Perlらしさ以前の問題だと思う。
こんな感じの改造すれば良いんちゃう? my @tasks = ( sub { () }, # <= funcA() とかが入る。 sub { () }, sub { () }, sub { () }, sub { () }, sub { () }, sub { 42 } ); my $argument ; for ( @tasks ){ my $flag = $_->( $argument ) ; next if ! $flag ; # エラー処理やりたきゃ、ここを真面に。 print qq{${flag}hoge\n} ; last ; }
>>366 エラー処理はfuncA()、funcB()の中で例外発生させて
全体をevalブロックでくくり、例外をキャッチして処理
エラー以外の分岐は適当に処理をブロックでくくり、last、redoなどでコントロール
eval {
funcA();
funcB();
{
funcC();
if (fuga) { resultA(); last }
resultB();
}
};
if ($err = $@) {
$err->A ? funcAErr() :
$err->B ? funcBErr() :
$err->C ? funcCErr() : Err();
}
メールを受信して、添付の画像ファイルを画像処理し、サーバに保存したいと考えています。 メール受信時に本プログラムにメールを渡すようにメールサーバは設定しています。 以下ソースの関係している部分です。 ----mailimage.pl----- my $parser = MIME::Parser->new; #ファイルの一時保存場所を指定 $parser->output_dir('./tmp'); $filename=''; #標準入力からメールを取得 my $entity = $parser->parse(*STDIN); #添付ファイルがある場合のみ処理 if($entity->is_multipart){ #パートの数(本文と添付ファイルの合計数) $count = $entity->parts; #メール本文以外(添付のみ)を取り出し(本文は0番目のため、一番目から取り出し) for($i = 1; $i < $count; $i++){ #ファイル名を含むパスを取り出し $path = $entity->parts($i)->bodyhandle->path; #ファイル名を取り出し $filename =time. (fileparse($path))[0]; $filenameglobal=$filename; `./out1 $path outputimg/$filename.bmp`; } } out1というプログラムが画像処理を行うファイルで、第一引数に入力を、第2引数に出力先をとるように作成しています。 mailimage.pl < sample.eml といった具合に、ローカル環境でeメールファイルを渡してやった場合は正常に動作します。 しかし、実際にメールを受信するとtmpファイルへの保存は行われるのですがout1で得られるべき出力画像が得られません。 どうやら、tmpフォルダに保存される前にout1を呼び出しているようで、入力がない状態になってしまっているようです。 解決策のご提示をよろしくお願いいたします。 また、一度ファイルに保存することなく直接メモリ上で受け渡す方法などもご提示いただけると幸いです。
371 :
デフォルトの名無しさん :2010/05/17(月) 01:35:34
perl から任意のアプリ(例えばメモ帳)を起動したいんだけどどう書けば良いのでしょうか?
perl -e "`notepad`
373 :
デフォルトの名無しさん :2010/05/17(月) 22:55:18
cpan> install XML::Atom *********いろいろ展開されて Please download the file manually, save it to a directory in %PATH% (e.g. C:\WINDOWS\COMMAND\), then launch the MS-DOS command line shell, "cd" to that directory, and run "Nmake15.exe" from there; that will create the 'nmake.exe' file needed by this module. You may then resume the installation process described in README. ------------------------------------------------------------------------------- Warning: No success on command[C:\Perl\bin\perl.exe Makefile.PL INSTALLDIRS=site] MIYAGAWA/XML-Atom-0.37.tar.gz C:\Perl\bin\perl.exe Makefile.PL INSTALLDIRS=site -- NOT OK Running make test Make had some problems, won't test Running make install Make had some problems, won't install Failed during this command: MIYAGAWA/XML-Atom-0.37.tar.gz : writemakefile NO 'C:\Perl\bin\perl.exe Makefile.PL INSTALLDIRS=site' ret urned status 512 cpan> と表示されてしまいました。とりあえず、nmake.exe はダウンロードしました。 これからどうすればいいでしょうか?
>>373 今使ってるperlをアンインストールしてActivePerlの最新版をインストールし、PPMを使え
うちcpanが成功した試しがないわ ppmならokだけど
XS系はことごとく失敗する気がする… 特にXMLやHTMLのパーサー関連は入らん at Ubuntu
まさかbuild-essential入れてないとかじゃないよな
XML-Atomはppmに無いからめんどくさいんだよな だから俺は使ってない あとこいつマルチだな
今ならStrawberry Perl入れた方が楽じゃない? XML::Atomもすんなり入ったよ
そもそもwindows系OSでperl使うのがすでに茨の道とも言える
なんで?
elseifでなく何故elsifなんですか?
母音が続くのが気持ち悪いから elifじゃないのと聞かれたら解答に窮するが、CPPはelifなんだよな 文化によって多少違いはあるが、やはり、母音が続くのが気持ち悪いんだと思う
いっそのことelfでいいじゃん。 短いし。
最近プログラミングの勉強を始めました print "hello world"; と書いてhello.plで保存し、ターミナルで perl hello.pl と入力するのはわかったんですが、hello.plはどこに保存すればいいのですか? 環境はMac OS Xです
>>386 今自分がいる場所におけばいい
違う場所に置きたいならフルパスで指定すれば実行できる
>>382 サンクス
つか、ppmguiにリポジトリのサジェストなんてあったんだな
そこにも載ってたわ
重ねてサンクス
>>386 perlの前にターミナルの使い方を覚えるためのBash入門を読んだ方が良いかも。
それは的外れなアドバイス
392 :
373 :2010/05/18(火) 21:37:27
現在 WinXP上にActivePerlが入っています。StrawberrryPerlを入れて共存できるのでしょうか?
エラーメッセージくらい読めよ
普通に考えるとパッケージ名ってAtom::XMLもしくはXML::Atomだからでは
396 :
373 :2010/05/18(火) 21:57:06
とりあえず、 install XML::Atom::Feed とすると、したみたいになった。これってATOM::XML ってインストールできたのかな Prepending C:\strawberry\cpan\build\XML-Atom-0.37-H4btN8/blib/arch C:\strawberry \cpan\build\XML-Atom-0.37-H4btN8/blib/lib to PERL5LIB for 'install' Installing C:\strawberry\perl\site\lib\XML\Atom.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Base.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Category.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Client.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Content.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Entry.pm Installing C:\strawberry\perl\site\lib\XML\Atom\ErrorHandler.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Feed.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Link.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Person.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Server.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Thing.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Util.pm Appending installation info to C:\strawberry\perl\lib/perllocal.pod MIYAGAWA/XML-Atom-0.37.tar.gz C:\strawberry\c\bin\dmake.EXE install UNINST=1 -- OK cpan>
perlで添付ファイル取得して、それをopencvに渡して結果を保存したいんだが、出来ない。 ローカルでemlファイル読み込ませるといけるのに、メール受信をトリガに起動するとだめだ・・。 どうして?
>>396 OKってかいてありますやん
心配なら
$ perldoc XML::Atom
>>396 XML::Atom と ATOM::XML は全く別のモジュールだ。
(存在すればの話しだが)
お前さんが、いくら XML::Atom を入れたとしても、
ATOM::XML は永久に入らん。
気持悪いったらありゃしない。
アハハハ
401 :
デフォルトの名無しさん :2010/05/19(水) 14:46:33
たとえば、[[:ascii:]]から'<'を除いた文字クラスを表わすにはどうしたらいいでしょうか?
もともと入ってないやん
数百のファイルを処理するPerlスクリプトがありまして、それがシーケンシャルに処理してて クソ時間がかかるため、マルチスレッドでやらせようとPerlについて勉強しています。 で、いまんとこ、セマフォで並列処理数を制御し、joinするためだけのスレッドを動かして かたっぱしからjoinするようにしています。おかげで処理時間は半分以下になったのですが、 これを添削していただけないでしょうか。もっとエレガントなやり方があれば教えていただきたいです。 よろしくおねがいします。 #!/usr/bin/perl use strict; use File::Basename; use File::Path; use threads; use threads::shared; use Thread::Semaphore; use Codemap; use SVG; my $concurrency = 5; my $semaphore = Thread::Semaphore->new($concurrency); my $exitflag :shared = 0; my $jointhreads = threads->new(\&joinThreads); while (@ARGV) { my $orig_svg = shift(@ARGV); $semaphore->down; threads->new(\&doSplit, $semaphore, $orig_svg); } $exitflag = 1; $jointhreads->join; exit 0;
sub joinThreads { until ($exitflag) { foreach my $thr (threads->list) { if ($thr->tid and !threads::equal($thr, threads->self)) { $thr->join; } } print "\nThreads joined.\n"; } } sub doSplit { my $semaphore = shift; my $orig_svg = shift; my $svg = new SVG($orig_svg); $svg->setdumpdir("work.d"); if ($svg->modtime() > $svg->splittime()) { $svg->dump(); print STDERR " $svg->{filename} : splitted\n" } else { print STDERR " $svg->{filename} : SKIP\n" } $semaphore->up; }
UTF8の〜をshift_jis(cp932)に変換して出力するとエラーが出てしまいます。 解決策があれば教えていただきたいです。 環境はWindows 7 64bitとActivePerl v5.10.1 64bitです。 use utf8; binmode STDOUT, ":encoding(cp932)"; print "昨日は10時〜6時まで寝た。\n"; D:\>test.pl "\x{301c}" does not map to cp932 at D:\test.pl line 3. 昨日は10時\x{301c}6時まで寝た。
D:\>test.pl 何故こんなところで作業しているのか
「〜」には FULLWIDTH TILDE (FF5E) WAVE DASH (301C) の二種類がある。
〜の厄介さはMacを使ってるとよく分かる
macでなくても〜は厄介
Macだとプログラムとか使わなくても 普段から〜が厄介になる
え? 俺は生粋のマカーだけど、厄介さが全然分からん。 何かトラブるっけ? "〜"って。 Mac<=>Winのデータ交換とかの話し?
Macで〜と書き込んだら Winだと逆向きの波線に見えたり 最近は大丈夫な気はするが
〜が厄介なんて、OS9時代の話だろ。 昔から機種依存文字問題とか、今はUTF8-macとUTF-8とか もっと厄介なモンがあるから。
OSXでの話だが
415 :
405 :2010/05/22(土) 17:06:03
皆さんレスありがとうございます。
>>405 はmeadowから打ち込んだ〜は\x{301c}となり、
notepad等から打ち込んだ〜は\x{ff5e}になる事が原因で表示に失敗していました。
\x{301c}はshift_jisでは表示に成功しcp932では失敗しました。
\x{ff5e}はcp932では表示に成功しshift_jisでは失敗しました。
どうやらeucとsjisの〜はutf8の\x{301c}に対応していて
cp932の〜はutf8の\x{ff5e}に対応しているようでした。
なので例えばeucの〜をutf8に変換し、それをcp932に変換すると失敗するようです。
挙動がおかしいと思った元のプログラムではネット上にあるeucのページを取ってきて
utf8に変換し出力時にcp932に変換していたので上記の理由で文字化けしていた様です。
そこでeucをutf8に変換した際に\x{301c}を\x{ff5e}に変換するようにしました。
$utf8data =~ tr/\x{301c}/\x{ff5e}/;
そうしたところprintした際に"\x{301c}" does not map to cp932というエラーも出ず、無事〜が表示されるようになりました。
意味不明
>>405 use utf8は「フツーは使うな」とCPANに書いてあった気がする。
Windowsを呪いながらEncode使え。
#!perl
use Encode;
my $msg = "昨日は10時〜6時まで寝た。\n";
Encode::from_to($msg, 'utf8', 'cp932');
print $msg;
>use utf8は「フツーは使うな」 理由は?
>>417 >use utf8は「フツーは使うな」とCPANに書いてあった気がする。
どこに書いてあったの?聞いたことない
> Do not use this pragma for anything else than telling Perl that your script is written in UTF-8. もしかしてこれの事か?
422 :
デフォルトの名無しさん :2010/05/22(土) 22:19:22
文字列の切り取りに関して質問があります。 $a="aho"; $b="baka"; $str="ahomanukebaka"; $strには$aと$bで"manuke"という文字が挟まれています。 このとき$strからmanukeだけを切り抜くにはどうすればよいでしょうか?
substr($str, length($a), length($str)-length($a.$b));
>>422 my $a1 = "aho";
my $b1 = "baka";
my $str = "ahomanukebaka";
$str =~ s/$a1(.*)$b1/$a1$b1/;
warn $str; # ahobaka
warn $1; # manuke
失敗してるのに前の$1を読んでしまう
>>425 あぁ、ごめん。本当はifとかやるけどmanukeが必要なのかどうなのかわからなくて
とりあえず$1に入ってるよって言いたかった
428 :
417 :2010/05/23(日) 01:13:47
>>420 それだ。
WWW::Mechanizeでcp932受け付けんからEncode::decode_utf8($massage)とかやってたのに、
use utf8だけで済んだのか・・・・クソアホみたいだわorz
正規表現のグルーピングについて質問です 繰り返し表れる対象をグループ化したいのですが良いやり方ありますか? gオプション付けたら行けるかと思ったらダメだった。 my $str = << 'END'; aba aca ada END $str =~ m{(a[^a]a)\n\n}g; # これだと初めの対象にしかマッチしない
>>429 g(global?)オプションだけでなく
m(multi line?)オプションもいるんじゃなかったっけ
>>429 こう?
my @matches = $str =~ m{(a[^a]a)\n\n}g;
>>430 $str =~ m{(a[^a]a)\n\n}mg;
これも試したけどダメだったんだよね
>>431 おぉ。いけました。
ちなみに=と=~を一緒に書くとわかりにくいので別にする方法ってありますか?
普通のマッチの場合、下みたいに分けたりしてるのだけどそういう方法があれば教えてください
warn $1 if $str =~ m{(a[^a]a)\n\n}g;
>>432 ifをwhileに変えるだけ
warn $1 while $str =~ m{(a[^a]a)\n\n}g;
gオプションが付いても付かなくても 正規表現に括弧がひとつしかないから、$2と$3は未定義。 ループを回すたびに$1の内容が変わる。
my @matches; push @matches, $1 while $str =~ m{(a[^a]a)\n\n}g;
while m//g とか while each %hash って気持ち悪いな
437 :
429 :2010/05/23(日) 14:34:43
>>433-435 なるほど!ありがとうございます。while使うのかぁ。知らなかった。
perldoc perlreに書いてあるのかなぁって探してみたら書いてあった。勉強になりました。
@matches = ( 'foo' =~ m{ o? }xg );
or
print "match: <$&>\n" while 'foo' =~ m{ o? }xg;
せっかくなのでついでにもう一つ質問ですが、
>>430 みたいにm付けた場合もやり方がありますか?
>>437 ないと思う
mは^と$の意味が変わるだけだった気がする
なんか改行コードだけ特別扱いなんだよな
Perlのif文で質問があります。とあるデータ文書からPerlを使って情報を抜き出しているのですが、 情報1、情報2というのが存在して、情報1にヒットしたときは、情報1と情報2を出力、 情報1にヒットしないときは、無視というような判定をするにはどうすればよいのでしょうか?
perlに関係ないような気がするけど、こういう意味じゃないの? if (情報1にヒット) { print 情報1; print 情報2; }
>>441 データ文書の情報1と情報2が別々のところに記載されていてそれができないのです。
元データ文書を晒すので少々お待ちください。
両方揃ってから判断するのだ
DB_FileとかDBI使えばいいのに……Plain/textとはまた面倒な
>>444 schoolがuoftokyoの作家の名前を抜き出し、
その名前から違う場所にあるデータを抜き出して出力したいってこと?
大して
>>441 とやること変わらない気がするな
if (情報1にヒット) {
作家名から情報2を取得;
print 情報1;
print 情報2;
}
こうなるだけじゃない?
>>446 仰る通りです。
コードを書いているのですが、情報1にヒットした後、
情報2を書き出してやると、UOFTOKYO以外の作家作品情報も出力されてしまい、
どうしていいのか分からない状態です。
>>447 情報2のデータの取得方法がおかしいんじゃいの?
そっちはどういうデータなの?
>>448 情報2はWORKSとENDの間の情報です。
while (<IN>){ $line = $_; なんだこれ
ああー、そんなこと書いたこともあった
テキストファイルだと
>>444 のようにやるのは無理なのでしょうか?
綺麗なコード書くなぁ 人の書いたコードは難しくて読めないことが多い俺にはちょうど良い読み易さだった
my $name ; while(<>){ $name = $_ if /^NAME/ ; next if ! ( /UOFTOKYO/ .. /^ID/ || eof ); print $name and undef $name if defined $name ; next if !(/^WORKS/ .. /^END/ ) ; print ; } 細かい所は知らん。
× /UOFTOKYO/ .. /^ID/ || eof ◯ /UOFTOKYO/ .. /^END/
>>456 おぉ。..ってそういう時も使えるのか。フラグ要らなかったな
正規表現に必ずxmsつける人ははじめて見たけど流行ってんの? 個々の意味はわかるけどこうしとくといい理由とかあるんだろうか??
>>460 Perlベストプラクティスに書いてあった癖で書いちゃう
普通は気にしなくていいと思う
>>461 気になるのでどういう理由でそう書いてあったか憶えてたら教えてください。
本屋に行くにせよ尼かなんかでポチるにせよ週末になっちゃうので待てないw
これ全ページ無料で読めるんだね、すごい。 売上が下がるかもしれないのにオライリージャパンは許容してるの?
多分許容してない>オライリー・ジャパン アメリカでは既に訴えられて裁判になり和解まで行ってるようだけど日本は分からん。 訴えられるまでやりますって感じかもね。 本は実際に手にとって読みたい人がいるからこれは良い宣伝になり売上が伸びる。 ってのもあるだろうけど、これだけで済ます人も多そうだ。
よく見るとわかるけどたまに表示されないページがあるよ。
って左下に「O'Reilly Japanの許可を受けてページを表示しています. 」って書いてあるじゃねーかw
少なくともおれの場合は中身が見られることで洋書を買う量が増えたよ。 見るのはgoogleより米amaの方が多いけど。
おおー こんなのが只で読めるとは
レイアウト解説本に載ってるのって、俺からすると読みづらいことばっか書いてるんだ コメントが行区切りの役果たしてるんだから空白行いらんだろ、かえって関数が盾に間延びする よく考えたらほとんどの環境でPerlの場合コメント着色されないんだっけ・・・区切りの機能果たさないなw
これ買うかどうか迷ってたけど欲しくなったわ
>>467 たまにどころか途中から全部仏陀義理じゃねーかw
そうなのか まだ頭の方だからたまに飛ぶくらいでかなり役立ってる
Perlに匹敵するモジュールがそろった言語って他にありますか? 具体的には ・ActiveDirectoryの操作(Net::LDAP) ・FTPs ・WWW::Mechanize ・DBI ・Net::DNS ・GD ・関数のpack このくらいはせめて欲しいのですが・・・
定番的なものはrubyにもpythonにも(そして多分schemeやHaskellにも)たいてい 相当するようなものはあるので好きなの使えばいいとおもうけど、そんなのは それぞれのスレに行って聞けよ。でもわざわざ他の言語使わんでもperlでいい んじゃね?
477 :
475 :2010/05/26(水) 14:27:29
>>476 ありがとう。
Perlしか分からないので、Perlで書いたものを他に移植することで
勉強はじめようかと思いまして。
とりあえずスクリプト言語はPerlを嫁にして、
C/C++、Javaあたり覗いてきます。
Encode::guessで判定して、decodeするときにFB_CROAKを指定して エラーにならなきゃOKとか?
480 :
デフォルトの名無しさん :2010/05/26(水) 19:29:25
guess_encoding()使ってるみたいだから、guessに失敗したら中断(現行コードのまま)でえーんでないの? そもそも -T の精度も疑わしいし、ましてやWindows環境だとマジックナンバー照合による判定は無理なんでは? 判定精度を上げたいなら use Encode::Guess qw/euc-jp shiftjis iso-2022-jp/; ↓ use Encode::Guess qw/euc-jp shiftjis iso-2022-jp cp932/;
全走査して\0が無ければテキストファイル。でもutf16/32は勘弁な。
>>478 テキストビューワなら、常にテキストと仮定しちゃえばいいんじゃないの?
>>482 まあ普通はそうだよなぁ
判定するようなエディタは少ない
484 :
478 :2010/05/26(水) 23:48:34
>>479-483 レスありがとうございます。
guess しに行く前にどうにか判定出来ないかと
都合の良い事を考えていたのですけども、
>>482 さんや
>>483 さんの仰るように常に対象はテキストファイルだと仮定して、
>>480 さんのご指摘の通り現行コードのままにする事にしましす。
>>480 cp932 の事をうっかり忘れていました。
寧ろ shiftjis より cp932 の方が重要なのに…。
ご指摘ありがとうございます。
shiftjisとcp932の両方を候補に入れるとほとんどの場合区別がつかなくて Encode::Guess->guessがエラー返すと思うのだが。 おおざっぱにいうとEncode::Guessの判定アルゴリズムは 1行ずつ候補のencodingでdecodeしていって、候補が1つになったら それを返す。候補がなくなったり複数残ったらエラー(ただしasciiが 最終候補に含まれていたらascii) だからね。
486 :
478 :2010/05/27(木) 09:36:54
>>485 その通りなのです。
事実上、shiftjis よりも cp932 のテキストファイルを扱う方が圧倒的に多いと思って、
より現実に即して、判別候補の shiftjis を cp932 に変更しました。
どっちを扱うのが多いかより「〜」などのunicodeへのマッピングが異なる文字を どうしたいかの方が重要なきがする。
俺も縦書きやったことあるけど unicodeに縦書き用のものがマッピングされてない約物({}…〜など)は 回転するしかなくて、そのなかでも波ダッシュは鬼門だったな。 ちなみに《》()「」『』【】〔〕の約物については縦書き用の文字が用意されてる。
日本語フォントには縦書き用のグリフが含まれるからそれを使えばいいんだよ
EncodeでUTF-8にして扱うなら波ダッシュは全角チルダになっちゃうんじゃないの?
上の方に出てたけどeucとsjisの〜をutf-8に変換するとWAVE DASH (301C)になり cp932の〜をutf-8に変換するとFULLWIDTH TILDE (FF5E)になるみたいだね。
20年前に少しかじったBasic言語しか知らないおらが、突然Perlを学ぶことに目覚めました。 たぶん初めてのPerlという良書のおかげです。 C言語とかJavaとかPythonとか色々学ぼうとして挫折を繰り返していました。 いきなりですが、質問があります。お教えください。 #!/usr/bin/perl print "Please enter a number \n"; chop($number=<STDIN>); while($number=~/|\D/){print "Please enter only a number! \n";chop($number=<STDIN>);} 以下数字が入力された場合に続く。 上記のように、何も入力されなかった(改行のみ)り、数字以外が入力されたときに エラーメッセージを出す方法を教えてください。 上記ではおそらくwhile($number=~/|\D/)の正規表現が間違っていると思います。 また、上記目的を叶えるためのエレガントな方法があればお教えください。
$number!~/^\d+$/ かねえ #!/usr/bin/perl print "Please enter a number \n"; while(1){ chop($number=<STDIN>); last if $number=~/^\d+$/; print STDERR "Please enter only a number! \n"; } とか…?
>>493 繰り返しループ処理のやりかたがわからないワケだな。
プログラミングの基礎が備わってないな。perl以前の問題。
フローチャートから勉強しなおしなさい。
496 :
デフォルトの名無しさん :2010/05/31(月) 19:29:57
この時代にフローチャートかよw
オブジェクト指向とかカプセル化とか言っても訳わかんない気がする
>>494 ありがとうございます!
上手く動きました!!
空文字列のみを見つける正規表現があるのかと考えていましたが、
数字以外はダメという表記で良かったんですね。
ネットで探しても空文字列のみを見つける方法がよくわからなかったので悩んでいました。
>>497 自信を持って分かりますとは言えませんが、
サブルーチンなどで、プログラムの部品(パッケージ化とかカプセル化というのでしょうか)を
作って、プログラムを汎用性が高く、分かりやすく作ることかと理解しています。
初めてのPerlには、変数の扱いがCとは異なり、グローバル変数として扱われてしまう
と書かれていたので、Perlはオブジェクト指向としては、少し扱いにくい言語ということ
なんでしょうか?
499 :
デフォルトの名無しさん :2010/05/31(月) 20:18:17
>>498 Perlはオブジェクト指向もサポートしている。
変数については、myを使えばローカルな変数になる。
my $hensu;
>>498 >空文字列のみを見つける正規表現
"\n"にもマッチしていいなら/^$/
>>498 が何版目の「初めてのPerl」を読んだのかが気になる。
まさか 1995年刊行の Perl4時代のソフトバンク版じゃあるまいな?
手元の第三版にはchopは索引に載ってなかった。 chompの頁に「古いperlではchop演算子が使われていることがあります。」ってちょろっと書かれてるくらい。
506 :
デフォルトの名無しさん :2010/05/31(月) 23:45:07
誤解されそうなコメがあるから、おいらが補足。 ラクダ本第三版の索引にはchopは普通に載ってるし、それ以前にこんなの最新版Perlでちょろっと確認すれば済む話。 chopが何故か忌避されるのは、鋏の使い方を知らない馬鹿が多すぎたってことかな。 現在主流の馬鹿御用達言語PHPで、文字列末尾1文字を無条件に削除したい場合、使えねーsubstr()とか、preg_replace('/.$/u','',$hoge)とか使ってると、頭に蛆湧いてくるぜ。
おおー。ここ勉強になりますね!
>>499 知りませんでした。
手元にあるPerl本は古本屋で買ったので
初めてのPerl 1995年6月16日 初版
Perlプログラミング1995年6月5日 第7版
でした。
>>500 後の80点はどの辺が足りないのかお教えください。
パッケージ化することで、グローバル変数が氾濫しプログラムが読みにくくなったり、
エラーが起きやすくなることを防ぐ。ということも(あっていれば)知っています。
>>503 正規表現面白いッス!
while($answer!~/^\d+$/)
while($answer=~/^$|\D/)
この二つはほぼ同じと考えて良いんでしょうね!
>>504 まさかの初版でした!!
これからもよろしくお願いしマース!
なにせ、読み始めたのが昨日からなんです。
連続投稿すみません 自分の勉強のために 汚いコードでスレ汚しになりますが、Chap2の私の回答も載せますね。 #!/usr/bin/perl $pai=3.141592654; while($pronum!=5){ print "Chose program # (1-4 or to quit 5).\n"; chop($pronum=<STDIN>); if ($pronum==1){ $pro1result=12.5*2*$pai; print "The result is $pro1result \n";} elsif($pronum==2){ print 'Enter the radius'."\n"; chop( $radius=<stdin>);$radius *= $pai *2; print "The result is $radius\n";} elsif($pronum==3){print 'Plese enter 2 variables'."\n"; $first=<stdin>; $second=<stdin>; $first *=$second; print "The result is $first \n";} elsif($pronum==4){print "Please enter num and character \n"; chop($num=<stdin>);chop($char=<stdin>);$char=$char x $num; print "The result is $char \n";} elsif($pronum==5){print "Thank you for playing! \n";} else{ print "Try again!\n";} }
>>507 どうしても「初めてのPerl」を参考にして勉強したいというなら、
悪い事は言わないから第5版にした方が良い。
今、Perl4時代の本で勉強しても百害あって一利無しだと思うぞ?
いくらなんでも時代遅れ過ぎる。
>>507 が使ってる Perl まで Perl4 というわでもあるまいに。
>>507 に必要なのは perldoc で perlintro を読む事
511 :
507 :2010/06/01(火) 06:24:42
>>509 そうですか。うーん。
正規表現とか、考え方とかはそんなに変わらないかと思ったんですが、
有害なんですね。
できれば、オンラインで学習できるのが一番なんですが、まとまったサイトってありますか?
>>510 ありがとうございます。
でも読むコマンドがわかりませんでした。
私は、Macなので、ターミナルを起動して
>perldoc perlintroとコマンドを入力してみましたが、
perlintroというドキュメントはないというようなエラーが出ました。
No documentation found for "perlintro".
515 :
507 :2010/06/01(火) 22:30:15
>>512 >>513 丁寧にありがとうございます。
無事Perlintroを読み終えることができました。
まだデータ形式のハッシュはよく理解していませんが、少しずつ理解しようと思います。
サンプルコードによる・・には、新しい版用のコードの書き方の解説もあったので、
今持っている初めてのPerl本と見比べながら学びたいと思います。
ありがとうございました!
2ちゃんねるにアクセスしたいんですがもうずっと人大杉となってしまいます。 回避する方法はありますか?
まず服を脱ぎます。
脱ぎました。 次はどうすればいいですか?
マジレスすると2chはUser-Agentがlibwww-perlとかだと弾くようになってる
文字列をutf8からsjisに変換するのに、jcode を使用すると特定の文字が変換されずに?になってしまいます。('1〜5' → '1?5') 正しく変換するにはどのようにすればよいのでしょうか。 #!/usr/bin/perl use Jcode; my $utf = "1〜5"; my $sjis = jcode($utf)->sjis; my $euc = jcode($utf)->euc; print jcode($sjis)->utf8 . "/" . $utf . "/" . jcode($euc)->utf8;
>>521 すみません。自己解決しました。
use Jcode; を use Jcode::CP932; に変えるだけでした。
昔の人がユニコードと既存の文字コードの対応関係を決めるときに 統一に失敗したので面倒なことになってます。ほんと迷惑。
Apache2+mod_perlやってるんですが、 その回のリクエストが終わっても残り続けるグローバルな変数って ありますか? メモリ上に残り続けるフラグを持ってリクエストのたびに処理を分岐したいです。
アクセス数(マルチスレッド)が半端ないので ファイルはなるべく避けたいです。 フラグ一つのためにDB構築するのもなんか微妙なので。
IPC::ShareLiteとか使うのがいいんじゃね?
528 :
デフォルトの名無しさん :2010/06/09(水) 11:53:33
printf "%.2f\n", 90.1730; printf "%.2f\n", 90.1740; printf "%.2f\n", 90.1750; printf "%.2f\n", 90.1760; printf "%.2f\n", 90.1770; printf "%.2f\n", 90.1630; printf "%.2f\n", 90.1640; printf "%.2f\n", 90.1650; printf "%.2f\n", 90.1660; printf "%.2f\n", 90.1670; この処理ですが、上の段は、5捨6入しているのですが、 下の段は4捨5入の処理をしています。 90.17 90.17 90.17 90.18 90.18 90.16 90.16 90.17 90.17 90.17 いろいろと試したのですが、printfがどういったルールで 丸めの処理をしているのかまったくわかりませんでした。 ググッてもこの処理の違いに関する説明もでてきません。 この処理の違いがわかる人はいませんか?
>>528 内部は2進数なので、2進数だと無限小数になっちゃう
数は有限桁数で表すと誤差が出るんだよな。
もう少し先の桁まで出すと
% perl -e 'printf "%.20f\n", 90.1750;'
90.17499999999999715783
なので四捨五入だと切り捨ての方になっちゃうんだよね。
>>526 なら、WebPage側にhidden項目でも作って、そこに保存しておくとか・・・
mod_perlは使ったことないけどmod_speedycgiなら……
533 :
デフォルトの名無しさん :2010/06/09(水) 16:10:35
>>524 グローバル変数で変数を持たせるとセッションが続く限り、内部データは引き継がれる。
これはspeedycgiでも同じ。
普通は変数が引き継がれると困るので、局所変数で宣言するが、普通のcgiだと、cgiが
実行されるごとに、グローバル変数はリセットされるため、局所でもグローバルでもあま
りあまり関係ない。そのため後からuse strict;で変数管理をしようとしてもエラーだらけで、
直しようがなくなる。
534 :
デフォルトの名無しさん :2010/06/09(水) 22:41:24
use strict するとエラーが発生するCPANモジュールは登録しないで欲しい。
>>534 まさかstrictにrefs入れてないよね?
use stritc; しておいて必要なところだけブロック切って no strict 'refs'; だろjk
>>534 obsoleteなブツなんでないの?
同等以上の新しいモジュールがあるだろ。
test.txt文書内にある abc001.jpg abc002.jpg という2行の文字列を <Vol.001>abc001.jpg <Vol.002>abc002.jpg と書き換えてoutput.txtに書き出すPerlスクリプトを書きたいと思っています。 しかし、test.txt内の文字列が1行の場合には上手くいきますが、 例のような複数行では <Vol.001>abc001.jpg abc002.jpg となってしまいます。 どこが間違っているのでしょうか? #!/usr/bin/perl use strict; use warnings; $a="test.txt"; $b="output.txt"; open my $in , '<', $a or die "Cannot open '$a': $!"; open my $out, '>', $b or die "Cannot open '$b': $!"; while(<$in>){ s/abc(.+?)\.jpg/<Vol\.$1>abc$1\.jpg/; print $out $_; }; close($in); close($out);
そのままコピペしたけどちゃんと動いたぞ? あと関係ないけど、せっかくuse strictしてるんだから$a , $b はつかうな
配列の宣言についての質問なんですが my @x=(1,2,3,4,5,6,7,8); my $y=100; my @pi =(@x/$y); この様に@で配列を制限し my @piの中身を1/100,2/100,3/100,4/100,・・・ として以下の計算につなげたいのですが、 どうしても上手くいきません・・・ foreach文なども試してみましたがダメでした 非常に低レベルの質問ですがどうかご教授よろしくお願いします
my @x=(1,2,3,4,5,6,7,8); my $y=100; my @pi; foreach my $tmp (@x){ push(@pi, $tmp/$y); } foreach my $tmp (@pi){ print "$tmp, "; }
key1, key2, ..., keyN, Value (N=10程度) のようなレコードを持ったCSVファイルに対して, keyA=AAAかつkeyB=BBBのレコードのValueの合計,平均,...etc といった統計を計算する最もスマートな方法を教えてください. レコード数は数十万〜数百万行を想定しています.
>>524 ourで宣言すればおk。
でも保持できるのはプロセス単位だから共有メモリ使った方がいいと思う。storableとか
my @pi = map {$_ / 100} (1 .. 8); print "$_, " for (@pi);
546 :
540 :2010/06/10(木) 23:13:47
>>542 その数ならDBに突っ込んでSQLでやる
合計と平均なら頭から読んで足したり数えたりするだけで いいと思うけど。
>>539 コメントありがとうございます。
問題点は、入力用ファイルの改行コードでした。
改行コードをUnixではなくMacの改行コードにしていたので、
2行が1行と認識されてしまっていたようです。
ずっと正規表現の問題だと思っていたので、コメントのおかげで別の観点で見直すことができました。
素人なのでもう一つ質問させてください。
>$a , $b はつかうな
というのは、意味のない変数名を使うのではなく、
$infile,$outputfileなどのように一目で意味のわかる変数名を使いなさいということでしょうか?
>>549 $aと$bはsortの時に使われる。つか、use strictしてるのにmyなしで動いてる時点で「あれ?」ってなったでしょ?
perldoc -f sort
> global variables $a and $b
551 :
507 :2010/06/11(金) 06:33:39
指定の処理を行いログを出力するプログラム hoge.plと そのログを読み込み解析し出力する analyst.plを作り、 普段はhoge.plを使いたまにanalyst.plを実行するという事をしてきました。 今回その解析済みログを利用するためにhoge.plの中でanalyst.plを実行させたくなったのですが require('analyst.pl');としたところ"\x{00cd}" does not map to cp932 at analyst.pl line 12. というエラーが大量に出ました。 これは両方のplファイルにuse utf8; binmode STDOUT ":encoding(cp932)";があり analyst.plでutf8からcp932に変換されたものがhoge.plでさらにcp932に変換されているからのようで analyst.pl内のbinmode〜;をコメントアウトするとうまく動くようになりました。 しかしanalyst.plの単独実行時にうまく動かなくなりました。 このような場合どうすれば両立させることができるのでしょうか?お知恵を貸して欲しいです。 This is perl, v5.10.1 built for MSWin32-x64-multi-thread
>>552 ちょっと面倒だけど新たにAnalyst.pmを作成し、そこにanalyst.plの機能を全部放り込んだサブルーチンを作り、
hoge.plとanalyst.plはそれを読み込み実行すれば両立出来るよ。
hoge.plとanalyst.plの二つのファイルだけでは・・・できるのかな?
>>553 そこまでするならモジュール化すればいいだろw
試してないけど ':raw :encoding(cp932)' みたいにレイヤー重ねがけすればとりあえず動くんじゃね
>>552 requireする前にbinmode STDOUT=>":raw";
あるいはanalyst.pl内のbinmode文をbinmode STDOUT=>":raw:encoding(cp932)";
557 :
552 :2010/06/15(火) 21:25:50
なるほど、:rawを重ねると生データにリセットできるんですね。
requireする前に一行追加することで簡単に実現出来ました。
呼び出し前に:rawにして呼び出し先で:cp932に再セットされるという流れもなんだか良いです。
>>553-556 みなさんレスありがとうございました。
558 :
552 :2010/06/15(火) 21:54:21
このスレ雰囲気良いね
一気に雰囲気が悪くなった
そんなこというなよ…
561 :
デフォルトの名無しさん :2010/06/16(水) 17:53:09
perlスクリプトファイルのコメント部分だけ取得する良い方法はないでしょうか? 単純に # より前を消すみたいのを自分で作ってたんですが、print '#'; とか、s#a#b#; というのも考えられるなとか、ヒアドキュメント中の # はどうするとか、、、 私の脳みそでは確実に無理なので、なにかないでしょうか?
つ正規表現
m{ hoge # not comment } と m{ hoge # comment }x の区別とか想像しただけで嫌になるよなw
$_ = '1"##"#a"'; print qq#\# match #, '#', "\n" if /"#a/ && m#[^\#]\##; # こめんと; { #" ですよ} 考えてみようとして例を作っただけでつらくなってきた
PPIとか使ってみれば? 正規表現の中のコメントは対応 できてないみたいだけど、他は結構いけるようだよ。
正規表現のxオプション使ってる?
>>561 Text::Balanced とかは?
とりあえず#の後に;がない行を抜き出してみて、それでどれくらい引っかかるか見てみれば? 厳密にやろうと思えば何らかのPerlパーサを使わないと、正規表現でちょいちょいやるっていうのは無理だろうな。
570 :
561 :2010/06/17(木) 10:33:00
>>562-569 ありがとうございます。なかなか難しいんですね・・。
気づいたのですが、秀丸とか(ほぼ)ちゃんとコメント色分け出来てますよね。
やっぱり偉大なソフトですね・・。
どの辺までフォローしてるのかしらんけど Regexp::Common::commentとか
秀丸の構文ハイライトルールと同程度で良いならそれこそ正規表現で十分だよ。
Windows上じゃ書かないし Emacs で充分だしなあ…。
>>575 のコードです
use LWP::UserAgent;
use
HTTP::Request::Common qw(POST);
my $res;
my $req;
my %param;
my $ua = LWP::UserAgent->new();
%param = ('username' => 'user', 'password' => 'pass');
$req = POST('ログインURL(サーブレット)',[%param]);
$res = $ua->request($req); #<-ここで同期的に動作させたい。
(VBだとvarAsync=falseで可能)
%param = ();
%param = ('number' => '3' );
$req = POST('ログイン後のURL(サーブレット)',[%param]);
$res = $ua->request($req);
print $res->content
これがセッションタイムアウトとAPメッセージが返ってきてしまう
LWP::UserAgentに非同期オプションなんざあったか?
my $ua = LWP::UserAgent->new(keep_alive => 1); でもダメでした。 ちなみにVBでも Dim dom As New MSXML.XMLHTTPRequest dom.Open "POST", "ログインURL(サーブレット)", true <-非同期 にすると今回のperlと同じ現象が起きるので このあたりだと思いますが・・・
VB事情はよくわかんないけど cookie_jar 使えば解決するとかいう話ではないの? 576のコードだと cookie を食わないから session cookie が届いてても 次の $req で全く使われないよ。
ああ、そういえばcookieの問題のようにも見えるな
>>580-581 ありがとうございました。
できました。
cookieでした、基本的なことだったんですね。
本当に助かりました。
VBのCOM(WEBブラウザ)では自動でやってくれていた
ことだったんですね。
%param = ('username' => 'user', 'password' => 'pass');
$req = POST('ログインURL(サーブレット)',[%param]);
$res = $ua->request($req);
my $cookie_jar =
HTTP::Cookies- >new( autosave => 1 );
$cookie_jar->extract_cookies( $res );
ua->cookie_jar( $cookie_jar );
以下・・・
perlで "\x11\x22\x33"という文字列後ろに0x4455という数値を追加して"\x11\x22\x33\x44\x55"という 文字列を作成したいのですがどのように記述すればいいでしょうか?
えっ
これでどうよ。\は適当に調整してくれ。 use strict; use utf8; binmode STDIN => ":encoding(cp932)"; binmode STDOUT => ":encoding(cp932)"; binmode STDERR => ":encoding(cp932)"; my $str="\\x11\\x22\\x33"; my $num=0x4455; my $str2=sprintf("%X", $num); if ($str2 =~ /^(..)(..)$/) { $str="$str\\x$1\\x$2"; } else { print "$str2 が指定の形式でない。"; } print $str."\n";
586 :
デフォルトの名無しさん :2010/06/21(月) 11:32:34
「Perlベストプラクティス」等を読んでいるのですが、 私的には読みやすいし誤解が無いと思うので組み込み関数を、 substr $s, 0, 1; といった書き方よりも、 substr($s, 0, 1); という風に括弧を付けた書き方をしたいのですが、こういう無駄な括弧は止めた方がいいのでしょうか? ------------ 将来、複数人と一緒に開発することもあるかもしれないので、 どちらのほうが主流なのか、もしくはどちらのほうがより好ましいのか教えて頂けないでしょうか。
引数可変のsubstrなら目的をはっきりさせる為にも括弧は、必要です。 自分がやった勘違いの例 perl -e '$str = "12345"; print substr($str,2,4),"end";' perl -e '$str = "12345"; print substr $str,2,4,"end";'
589 :
デフォルトの名無しさん :2010/06/21(月) 19:36:22
Text::Txのppmはまだ無いのでしょうか?
590 :
デフォルトの名無しさん :2010/06/21(月) 20:25:52
拡張子がc,cc,hなファイルからcall_handlerという文字列を探してファイル名と該当行を表示させたいのですが xargsが渡してきたファイル群の何番目を処理中か知るにはどのようにすればいいでしょうか? find . -regex '.*\.\(c\|cc\|h\)' -print0 | xargs -0 perl -ne 'if(/.*call_handler.*/g){print($ARGV[?????????], ": " ,$&, "\n")}'
>>590 perl 使わずに grep じゃだめなのかな?
find . -regex '.*\.\(c\|cc\|h\)' -print0 | xargs -0 grep -H -n call_handler
./a.c:1:call_handler hogehoge
perl スレということで perl 使うというならちょっと考えてくる
>>590 find . -regex '.*\.\(c\|cc\|h\)' -print0 | xargs -0 perl -ne 'print "$ARGV:$_" if /.*call_signal_handler.*/'
593 :
591 :2010/06/21(月) 23:47:58
>>592 なるほど、$ARGV でとれるのか〜。
勉強になった。
# call_signal_handler になってて始めテストしたとき
# 引っかからなくってあれれってなってしまった^^;
594 :
586 :2010/06/21(月) 23:59:46
>>587-588 ありがとうございます。
でも、あんまり反応無いんですね。
ほとんどの現場で特に決まってないってことなんでしょうかね・・。
PBPのp190に書いてあるから、みんなレスしなかっただけじゃねーの? hoge( 'foo', 'bar' ) # <= サブルーチン。 substr $str,2,4 # <= 内部関数。 PBPにあったか不明だが、上記を守ると必然的に、 内部関数の引数を明確に区切りたい場合は、 ( substr $str,2,4 )
以下のコードで""が"?"に化けてしまうのですが何が原因でしょうか? ファイルはUT-8で作成しています。(""は口ではなく目になっている奴です) use Encode; $string = decode('utf8', "あ"); printf "%s\n", encode('shiftjis', $string); $string = decode('utf8', ""); printf "%s\n", encode('shiftjis', $string);
>>596 出力するターミナルはshiftjisなの?
shiftjisにハシゴ高は無い cp932にはあるけど
ありがとうございます、CP932を指定して出るようになりました。
>>595 それが例だとそういうときは
substr($str,2,4)
にしろってなってるんだよな。俺は595のように全体を
カッコでくくる方が統一的でいいと思うんだが。
なるほど、いいね。
普通に考えると、統一する理由がないな 理不尽なクレームをつけてくる奴が「現場」にいたとしても そいつが何を考えてるのかは誰にも分からない
つ「C言語脳」
rubyも()省力できるよな。
rubyは()を省略できると言うか、文字ごと省略できることに驚いた
606 :
586 :2010/06/22(火) 13:17:58
>>595 ,
>>600 PBPって通称があるんですね。ページ数までありがとうございます。
該当のページには、組み込み関数には括弧を付けるなとありますね・・。
でも、私の感性がヘンなのかもしれませんが括弧は付けた方が見やすいかなと思いまして。
my $t = substr($str,2,4);
my $t = substr $str,2,4;
my $t = (substr $str,2,4);
でも、確かに3番目の書き方でも良い感じですね。見やすい。
最初に(をタイプするというのは打ちにくいかもしれないですけど。
まずコンパイラが誤解しないように書くのが大前提として、
括弧があってもなくても問題ないような場合は人間にとって見やすいと思うほうにすればいい。
全てを機械的に統一する必要も、PBPを盲信する必要もない。
>>606 の例みたくシンプルに1文で済むような場合は誤解の生じようもないし好きに書けばいい。
ただ、この場合3番目は不自然というか意味ねーと思うけど。
↓みたいな場合は括弧を使わざるを得ない。けどこれもどっちがいいかはケースバイケースかな。
print +(substr $foo, 0, 1), "が1文字目\n";
print substr($foo, 0, 1), "が1文字目\n";
っと、そういえば組込み関数に括弧つけたい派の
>>586 は、print使うときも
print("hoge"); とか (print "fuga"); みたいに書くのかね?
組み込みかどうかって分け方も微妙だよなぁ。List::Utilぐらいの 有名モジュールになると気分的にはほとんど組み込みみたいな もんだし。 結局なんとなくオレ基準で決めてるな。同じ関数はだいたい同じ にはしてるけど。
関数か、関数でないか。 そこが意見の分かれ目じゃないか。 小学校だか中学校だか忘れたが 関数には y=f(x) みたいにカッコをつけるって習っただろ。 printが関数なら、カッコつけるだろうし 関数ではない、と思うならカッコつけない。 C言語脳に冒されたヤツらは何でもかんでも関数にしちまった。 挙句の果てに値を返さないvoid関数というクソまで生み出しちまった。
print(print("うんこ"));
>>609 でもprintfにつけないんならsprintfにもつけたくないんだよなぁ。
sprintfは明らかに関数なんだけど。
『C言語脳』ってちょくちょく出てきていますが、 これはバカにしてるの?
一人の人が言ってるだけだから、ほっとけば? 珍しく長文書いたと思ったら頓珍漢だし。
614 :
デフォルトの名無しさん :2010/06/23(水) 22:37:14
以下のような場合に、色々なコンテキストに対応するにはどのようにしたらよいのでしょうか? my @a = &wrapper(); # リスト my $s = &wrapper(); # スカラー sub wrapper{ print "-start-\n"; my @re = &func; # ★ リストしか・・ print "-end-\n"; return @re; } sub func{}
615 :
デフォルトの名無しさん :2010/06/23(水) 22:41:29
私ではこういうのしか思いつかないんですが、 なんとなく格好悪いしもっとスマートな方法は無いでしょうか? sub wrapper{ print "-start-\n"; if(wantarray()){ my @re = &func; # ★ リスト print "-end-\n"; return @re; }else{ my $re = &func; # ★ スカラー print "-end-\n"; return $re; } }
wantarray
その例だと、func サブルーチンの中も wantarray したい様に 見えるんだが。 sub func { ( 1,2,3,4) ;} # 取り敢えずの例でリストを返しとく。 sub wrapper{ print "-start-\n"; my @re = func ; # func がスカラーを返したとしても配列にセット。 print "-end-\n"; return wantarray ? @re : $re[0] ; } printf "%s\n", join ",", wrapper ; # リスト printf "%s\n", scalar wrapper ; # スカラー
私の文章力が足りなくてすみません。 sub func{} も同じコンテキストで動かしたいのですが・・。
じゃ617でいいじゃん。
>>619 は間違い。
sub func{} の中もwantarrayしたいって事だよね?
sub func { wantarray ? ( 1,2,3,4) : 1 ;}
sub wrapper{ return func; }
#print文なんて飾りです。偉い人には(略
sub func { return $_[0] ? ( 1,2,3,4) : 2 ;} #sub wrapper{ return func wantarray; } sub wrapper{ my $f = wantarray ; return func $f ; } こっちの方が適切か? 何れにしても617からのレスで例は十分出したから、 肉付けは御自分でどーぞ。
十分て if を?:で書き換えただけなのに無意味に偉そうだな
623 :
614 :2010/06/24(木) 11:49:44
やっぱり、私の文章力が足りなかったようですみません。
>>614 のような場合にコンテキストが func では変わってしまう場合があるので、
変わらないようなスマートな書き方無いかなという質問でした。
return &func;
という書き方ではコンテキスト変わらないので困らないのですが、例のように
returnから引き離したときにどうすればいいのかなと。
で、恥ずかしながら稚拙な
>>615 の例を書いてみたのですが。
変数の中身の16進ダンプを行うため、 printf "data=%20.20s\n", unpack("H*", data); などとやっているのですが ”313e1cb8f94b” と表示され見難いので ”31 3e 1c b8 f9 4b”と空白を入れて表示したいのですが、できるだけ シンプルなコードで表示するにはどのように書けばいいでしょうか?
printf "data=%20.20s\n", join " ", (unpack "H*", "hoge" ) =~ /(.{1,2})/g ;
ありがとうございます、使わせていただきます。
ずぶの素人なのですのでお手柔らかにお願いします 今2つのテキストファイルがあって、内容はおおよそ下のようです --------------テキストA------------------- fcart1 -0.0000000000E+00 -0.0000000000E+00 1.0770536961E-04 -0.0000000000E+00 -0.0000000000E+00 6.6543134784E-04 -0.0000000000E+00 -0.0000000000E+00 -7.7313671745E-04 getden1 0 ------------------------------------------ --------------テキストB-------------------- xred 0.0 0.0 0.047843858990 0.0 0.0 0.000434433306 1/3 2/3 -0.011730466739 #Definition of the planewave basis set ------------------------------------------ テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足したいのですが どのようにしたらいいでしょうか ご教授お願いします
>>615 wantarray ? func() : scalar func();
629 :
デフォルトの名無しさん :2010/06/25(金) 16:15:17
1. print Dumper( $hoge); --- $VAR1 = { 'entry' => [ { 'title' => ' aaa', '-id' => 'aaa' }, { 'title' => ' aaa', '-id' => 'aaa' } ] }; --- 2. foreach( $hoge->{entry}){ print Dumper( $_); } --- $VAR1 = [ { 'title' => ' aaa', '-id' => 'aaa' }, { 'title' => ' aaa', '-id' => 'aaa' } ]; ---
630 :
628 :2010/06/25(金) 16:17:18
3. foreach( @$hoge->{entry}){ print Dumper( $_); } --- (出力なし) --- 4. my $foo = $hoge->{entry}; foreach( @$foo){ print Dumper( $_); } --- $VAR1 = { 'title' => ' aaa', '-id' => 'aaa' }; $VAR2 = { 'title' => ' aaa', '-id' => 'aaa' }; 1.のデータ構造を持つ変数があり、その内容をforeachで抜き出したいのですが、なかなか理解が出来ません。 4.の方法で実現できたのですが、どうして3.では実現が出来ないのでしょうか? もしよろしければ、解説いただければと思います。
foreach (@{$hoge->{entry}}) {
Perlでプログラムの練習をしているのですが、わからないことがあります。 ハッシュの配列で、 [ { "id" => "1", "com"=> "2" }, { "id" => "2", "com"=> "2" } ] のような物があったとして、idが1のハッシュのcomの値を取得したいのですが、 foreach等でスキャンするしか方法はないのでしょうか? ハッシュの配列がかなり大きく、idの呼び出しもかなりの回数行うことがあるので負荷などを考えると、効率のいい探し方はないかと調べております。
その通りだろうなあ id値→配列インデックスなどの逆引きでも作っておかない限りは…
>>633 そういうのはデータベース使った方がいいんじゃね?
確かDBD::SQLiteあたりならデータベースをメモリ上に持てたはずだし。
>>633 そのデータ構造じゃ、
>>634 みたいなことしない限り無理だろう
idをキーにするほうが自然じゃね?
{
1 => {
"com" => "2",
},
2 => {
"com" => "2",
},
}
ハッシュの配列 => @hoge 求めたいid => $id だったとしたら単純に $hoge[$id - 1]->{com}じゃん。
$idと配列番号の差が定数ならそれでいいんだろうけど…
調査の為に、<STDIN>の内容を一気に ファイル出力するコードを入れたのですが my $data = do{ local $/; <STDIN>}; open(FILE,">./stdin.eml"); print FILE $data; close (FILE); #↑これは成功 その後にSTDINを入れた$dataを再利用しようとして、 以下のコードを書きましたが while (<$data>) { print $_ . "\n"; } としても$dataを表示することができません。 while ($data) もだめでした 配列に代入する方法ではできたのですが、 perlならシンプルなコードが書けそうな 気もしますので、配列以外の方法で実現する方法 をご教示ください。
ん?なんで$dataをブラケット<>で囲むんだ? while (<$data>) {}だと$dataに格納されている文字列が示す名前の ファイルをオープンして順次$_にセットする挙動…のはず print $data; #でOK そもそもこれは成功コードでprint FILE $data;ってあるじゃん…
>>641 ファイル出力後、
$dataの内容を1行ずつ処理したいということです。
while内処理のprint はあくまで例でした。
以下のコードで実現できますが、
配列を使わずに、シンプルにでき方法があれば
ご教示ください。
my $data = do{ local $/; <STDIN>};
open(FILE,">./t3.eml");
print FILE $data;
close (FILE);
@lines = split("\n",$data);
for(my $i = 0;$i <= $#lines;$i++){
$r = $lines[$i];
if ($r =~ /From:/i){
print "$r\n";
}
}
配列を忌避する理由がわからないな… どうしてもというならfor句に直接splitを突っ込んで 見かけだけ配列を避けるとか、m//使うとか考えられるけど… やっぱりSTDINからとってくるときに$/そのままにして 一行ごとに配列に入れるようにしない?やっぱり嫌?
readlineぽくやるってことなら while (my $r = /(.*?)\n/g) { }
>>643-644 ありがとうございます。
配列が嫌ってわけではないです。
シェルスクリプト(sh系)なら
recs=`cat ./data.txt`
for rec in $recs; do
処理・・・
done
こんな感じでできるのでperlも
直接処理ができるのかと思いました。
元々のコードは
while(<STDIN>){
$r = $_;
処理・・・
}
なのですが、
今回<STDIN>の中に
複数のOSの改行コードが存在する
疑惑があり、処理が正常に動かなかった為、
調査のために、ファイルに一気に出力しました。
素直に配列でやります。
646 :
デフォルトの名無しさん :2010/06/27(日) 14:24:24
「大きいファイルを複数行な正規表現にマッチさせたいんだけどいったん変数に 全部読み込むのはどうよ」問題なのですが 正規表現ライブラリ側で「もうちょい食わしてくれたら完全にマッチするかもしれない」 みたいな意思表示をしてくれたら解決すると思うのですが、そんな素敵ライブラリありますか?
あまりに巨大なマッチングなら マッチングを前半と後半とかに分解した方が素直な場合があるけど それはどうしても避けたいパターン?
>>645 open my $fh,'<',\$data; # 詳細は PerlIO::scalar 参照
while(<$fh>) { ... }
みたいなやり方はあるけどね。
でも、自分が素直だと思う方法を迷わずに使うのは充分にperlらしいやり方だと思う。
>>645 のシェルスクリプトっぽい形なら、
>>643 がいってるように↓じゃダメ?
my $data = do{ local $/; <STDIN>};
for my $r (split /\n/, $data) {
print "$r\n" if ($r =~ /From:/i);
}
>>648 のほうが無駄はなさそうだけど
650 :
646 :2010/06/27(日) 20:27:04
>>647 どうしても避けたいパターン? というよりはどうにかして避けるべきパターンだと思うのです
よくわからないけど、Perlで書くなら、大きいファイルでも全部変数に読みこむ方が 望ましいと思う
具体例を挙げないから、「どうにかして避けるべきパターン」っ てーのが想像出来ん。
メモリが2Gしかないのに、対象が10Gもある
??
それだと、
>>647 氏の指摘通り、マッチング分解して
各行解析するしか無いんじゃねーの?
パターンを分けられたら範囲演算子で /start/ .. /end/ みたいにして ループぶん回せるんだけど、これもできない事情が何かあるのかな
File::Stream::findでそれっぽいことやってるかしらん
657 :
507 :2010/06/28(月) 17:48:16
Perlでリアルタイムキー入力ってどうやったらいいんでしょうか?
やりたいことは、文字列+Enterでなくて、矢印キーなどでリアルタイムに信号を送って
動くプログラムを作りたいと思います。何かヒントはあるでしょうか?
リアルタイムキー入力に関しては、
http://aplawrence.com/Unix/perlinput.html にあった、vec($rin,fileno(STDIN),1)=1;
がひとつの方法かと思いますが、これをどう利用したらいいかまだ分かっていません。
矢印キーなどはPerl内ではASCIIコードで表現するのでしょうか?
selectじゃなくてvecがキモだと思って いるようでは先がおもいやられる
660 :
507 :2010/06/29(火) 00:45:15
>>658 私にはまだ、理解できないスクリプトです。selectあたりをもっと勉強してみます。
>>659 コメントありがとうございます。
use Term::ReadKeyで取り敢えずリアルタイムキー入力はできるようになりました。
次の課題は、方向キー(矢印キー)の入力をどう判定するかです。
アドバイスを頂けたらありがたいです。
現在のスクリプト
#!/usr/bin/perl
use strict;
use warnings;
use Term::ReadKey;
ReadMode 4;
END { ReadMode 0 }
print "q to quit \n";
my $key = ReadKey;
while ($key ne 'q'){print $key;$key = ReadKey;}
print "\n";
普通引数無いなら()つけるだろ……分かりにくい
つーかTerm::ReadLine使えよ……
663 :
507 :2010/06/29(火) 03:23:49
>>661 >>662 すんません。
もっと勉強します。
矢印キーの受け取りについても教えてください。
ASCIIコードをつかうのではと思うのですが。
665 :
デフォルトの名無しさん :2010/06/29(火) 06:05:05
実際に押してみてどんなキーコードが入力されるか一つ一つ調べればよくね?
666 :
507 :2010/06/29(火) 13:36:48
>>665 出来れば、その方法を詳しく教えてください。
色々しらべてだんだん分かってきました。
ASCIIコード内の文字の表記法は分かりました。
\100=8進数表記で@を表す。\x..は16進数表記。
しかし、矢印はASCIIコードじゃないですね。
ASCIIコードの制御コードは33個しかなくて、矢印キーは入っていませんでした。
ググってJAVAプログラムの例とかは見つけました。
そこから推測するにTerm::ReadKey あるいはTerm::ReadLineの
パッケージにそれようのコマンドがあるのではないかと想像しています。
もうひとつの方法は、キー入力で受け取った値を別の文字コードに変換して
出力することですが、まだ出来ていません。
667 :
507 :2010/06/29(火) 15:09:15
いろいろ調べて、 Term::TransKeys; このモジュールを使えば矢印キーを認識できるようになることは分かりました。 しかし、紹介されているsampleプログラムが難解すぎて使いこなせていません。
急に「ピリオド階層テキスト」とか言われても、意味わからん
>>668 通りすがりだけど
テキストファイルのエンコーディングが単一でない限り
連結した際にぶっ壊れたファイルが出来上がるような気が
Perlが自動的に面倒みてくれるとかだったらごめんね
そういう特定のアプリケーションを出されても、知らない人は知らないんだからさ。 そのスレッド最初から全部読めとでも言うの? どういう結果がほしいのかだけ書いてくれれば、仕様どおりにコーディングできるんだけど。
>>673 ・とあるディレクトリd0以下に存在する全てのディレクトリをなぞる。
・このとき、今位置するディレクトリdnの相対的な深さをdとして、
d個のピリオドをディレクトリdnの名前の前に足した文字列 をファイルFに出力する。
・また、このとき、今位置するディレクトリdnにテキストファイルがあれば、
d+1個のピリオドをテキストファイルtnの名前の前に足し、拡張子.txtを除いた文字列 をファイルFに出力する。
・さらに、そのテキストファイルtnの内容をそのままファイルFに出力する。
テキストファイルtnの内容の各行頭には、ピリオドはつけない。
テキストファイルtnの内容のとある行頭にピリオドがある場合は、ピリオドの前に半角空白を入れる。
このような仕様です
>>674 ありがとうございます
まったくの期待通りですが、
ピリオドの数が合わない部分がありました
下のようなディレクトリで試しました
ttp://www1.axfc.net/uploader/Sc/so/128829.zip ウイルスチェックはしましたが、念のためもう一度お願いします
677 :
507 :2010/06/30(水) 13:10:10
TransKeysのソースコードを見たらこんなだった。 '27-91-65' => '<UP>', '27-91-66' => '<DOWN>', '27-91-67' => '<RIGHT>', '27-91-68' => '<LEFT>', ぐぐったらREBOLというのに関係ありそうだけど 素直にモジュール使うほうが楽なんだろうなぁ。
Perlの継承について質問させてください。 親クラスも初期化し、子クラスも初期化して使う書き方がよく分からず混乱しています。 例えば以下のコードのように、親クラスも初期化する必要があるが、子クラスに追加フィールドを持ちたい場合、 どうやって両方を初期化して、全て子クラスのオブジェクトとして持ち歩けばよいか分かりません。 このコードの場合だと、親クラスのコンストラクタを呼んで、その参照を bless しただけで、子クラスの 追加フィールドを bless 出来ません… bless は唯一つのハッシュリファレンをクラスと紐付けるものだと理解していますが、 この場合はどうすれば良いのでしょうか?アドバイスいただけますと幸いです。 #!/usr/bin/perl package Parent; sub new { my ( $class, $arg ) = @_; return bless { "parent" => $arg }, $class; #引数をparentにセット } sub print { print "Parent: " . shift->{"parent"} . "\n"; #parentの内容をprint } package Child; use base qw(Parent); sub new { my ( $class, $arg ) = @_; my $super = $class->SUPER::new($arg); #親クラスコンストラクタ呼び出し my $field = { 'child' => '20' }; #子クラスの追加フィールド return bless $super, $class; } package main; my $child = new Child(10); #子クラスのインスタンス作成 print $child->print(); #親クラスのfieldをprint
>>678 初期化処理は別メソッドにしてnewはblessした後に初期化メソッドを呼ぶだけ
にする。
package Parent;
sub new {
my($class, @args) = @_;
my $self = bless {}, $class;
$self->initialize(@args);
return $self;
}
sub initialize {
my($self, ...) = @_;
# Parentの初期化処理
...
}
package Child;
use base qw(Parent);
sub initialize {
my($self, ...) = @_;
$self->SUPER::initialize(...);
# Child の初期化処理
...
}
Child->SUPER::new()の返り値はParentじゃなくてChildオブジェクトとしてblessされたhashrefなんだから、 あとは普通のhashrefに対してするように必要なフィールドを足してやるだけでいい。 package Child; use base qw(Parent); sub new { my ( $class, $arg ) = @_; my $self = $class->SUPER::new($arg); $self->{child} = 20; $self; }
681 :
678 :2010/06/30(水) 15:58:41
>>679 レスありがとうございます。
お示しいただいたコード例では、以下のように子クラスのinitializeを明示的に呼んでやるというイメージであっていますか?
my $child = new Child(); #親のnewが呼ばれる
$child->initialize(); #子クラスの初期化メソッド。中で親クラスの初期化メソッドも呼ばれる
子クラスで新たにフィールドにハッシュを追加したい場合は
package Child;
use base qw(Parent);
sub initialize {
my($self, ...) = @_;
$self->SUPER::initialize(...);
$self->{'newField'} = "something new"; #追加
}
のような感じですかね?とてもとても勉強になりました。ありがとうございました。
682 :
678 :2010/06/30(水) 15:59:44
>>680 明快かつ簡潔な答えありがとうございました。仰るとおりですね。
まだ脳がPerlに慣れていないようですぐにはそのことに思い当たりませんでした。勉強になりました。
683 :
678 :2010/06/30(水) 16:33:17
678です。多重継承でも同様の質問があるので、私の理解で合っているか確認させてください。
複数の親クラスを別の引数で初期化する時は
>>679 さんの方法はそのままでは使えないので
初期化用のメソッド名を重複しない様にするぐらいしか自分では思いつかなかったのですが、
もっとスマートなやり方がありましたら是非ご指導ください。
以下の例では、
>>679 のように、親クラスのnewは初期化メソッドを呼ぶだけだが、
初期化メソッドの名前をそれぞれ initA(), initB() としたつもりです。
use base(ParentA ParentB)
sub new {
my $class | shift;
return $class->NEXT::new(); #両方の親クラスのnewを実行
}
sub init {
my $self | shift;
$self->SUPER::initA();
$self->SUPER::initB();
}
my $child = new Child();
$child->init();
$child->parentAmethod(); #ParentAにしかないメソッド
$child->parentBmedhod(); #ParentBにしかないメソッド
684 :
678 :2010/06/30(水) 17:06:14
678です。
>>681 で大きな勘違いをしていました。
new Child(); したときに呼ばれる initialize() は、親クラスのそれではなく
子クラスのそれなのですね…目からうろこでした。
今日一日でずいぶん疑問が氷解しました。ありがとうございました。
>>675 直下のディレクトリの内容を表示する時はピリオドがひとつ増える。
カレントディレクトリのファイル名もピリオドがひとつ増えるのだとすると、
区別がつけ難い。なにか仕様に誤りがあるのでは?
丸投げしないで。 ちった自分で考えろ
>>685 「ディレクトリの内容」が
@file = readdir ( DIR ) ;
での@fileを指すならば、それは出力しませんし、ピリオドも増えません。
以前から不思議だったんだけど、パスの一覧作るのに、 再帰呼び出し使うのってどっかの参考本にでも載ってるの? 普通にsplice利用すれば良いのに。 use Data::Dumper ; use Cwd ; sub make_list { my $i = 0 ; for ( @_ ){ $i ++ ; -d $_ and splice @_, $i, 0, sort grep !/^\./, glob "$_/*" ; } @_ ; } print Dumper [ make_list getcwd ] ; もっと言えば、coreのFile::Find使えって話しになるけどさ。 perl -MFile::Find -MCwd -le 'find sub{ print $File::Find::name }, getcwd '
×$i ++ ; -d $_ and splice @_, $i, 0, sort grep !/^\./, glob "$_/*" ; ◯$i ++ ; -d $_ and splice @_, $i, 0, sort glob "$_/*" ;
690 :
507 :2010/07/01(木) 00:42:40
>>665 やっと自己解決しました。
use Term::ReadKey;
ReadMode 4;
END { ReadMode 0 }
while ((my $key=ReadKey) ne 'q'){print ord($key)."\n";}
これで押したキーのASCIIコードが表示されるようになりました。
しかし矢印キーは一度押すと同時に3つのアスキーコードを
送ってくるようなので、矢印キーが押されたかどうかを判定するスクリプトを
どう処理したら良いの困っています。ヒントを下さい。
>>688 $.でカウントされている@_での$_[$.]が$_、
とかはperlerには「普通」なのか……
692 :
507 :2010/07/01(木) 01:11:07
>>690 まだ不完全ですが、なんとなく自己解決しました。
矢印キーを押すと挙動不審になりますが、いちおう
矢印キーが押されたら、その方向を表示し、通常のキーが押されたら、
そのキャラクタを表示するプログラムです。
改善点があればぜひご指導下さい。
use Term::ReadKey;
ReadMode 4;
END { ReadMode 0 }
while ((my $key=ReadKey) ne 'q'){
if(ord($key)==27){
if(ord($key=ReadKey)==91){
if(ord($key=ReadKey)==65){print "<UP>\n";}
elsif(ord($key)==66){print "<DOWN>\n";}
elsif(ord($key)==67){print "<RIGHT>\n";}
elsif(ord($key)==68){print "<LEFT>\n";}
$key=ReadKey;
}
}
print $key;
}
>>691 @_は$.でカウントなんてされてないぞ。
694 :
688 :2010/07/01(木) 06:23:06
>>691 「普通にsplice利用すれば良い」ってだけだから
for文は好みにすればいいよ。
(実際の所はspliceもキモでもないんだけどw)
sub make_list{
my @list = @_ ;
my @out ;
while( my $file = shift @list ){
push @out, $file;
next if ! -d $file;
unshift @list, sort glob "$file/*" ;
}
return @out;
}
>>693 じゃあforの@_はどうやってカウントしてるんだ?
splice使うのが「普通」なのか。
perlなんてさ、ただの一時しのぎだろ。
ロジックの確認するだけ。
とりあえず間に合わせでperlで書いといて
あとで他の言語に書き換えたいよな。
できるだけperl固有のやりかたは避けたい。
つぶしが利かん。
それに、「普通」だと言っておきながら
>>689 みたいなミスを犯すならバカらしいじゃん。
もっともっと複雑な処理をしたいとき、どーするよ?
一時しのぎなんだから使って結果を得たらおしまいだろw あとで他の言語に書き換えるぐらいならはじめからそっちで 書くわい。
一定のフォーマットで出力されるcsvやテキストデータを処理してから、 ExcelやAccessに渡したりするにはPerlが便利だと思う。
open(SYS, "dir /s /b |"); while (<SYS>) { print $_; } close(SYS);
>>694 ループで配列をshiftしつつunshift、
長さが変わる@listのshift位置を何が記憶してるのかが謎。
$.ではないし、何か専用のポインタのようなものでもあるの??
長さがかわろうがなにしようが配列自体が変更されてるんだkら shift位置の記録とかそんな考え方はいらんだろ。常にその時点 での配列の先頭要素を削って取り出すのがshift。
じゃ
>>688 の for (@_) はどうやってるんだ?
たまたま動いているだけだな。 perlsynにはやっちゃいけないと書いてある。 LIST のいずれかの部分が配列であった場合に、たとえば splice を使って ループの本体でその要素を削除したりあるいは追加したりすると foreach は非常に混乱してしまいます。 ですからそういうことをしてはいけません。
ディレクトリ構造自体が再帰的構造なんだから 再帰を使うのは至って自然なことだと言ってみる。
再帰って goto と同じレベルで使用禁止になってるもんだと思ってた。
え?
フィボナッチ数の計算とか明らかに再帰使うだろ
フィボナッチごときで再帰いらねーだろw
分かりやすく綺麗に書こうと思ったら再帰になるとおもうんだけどな それとも再帰以外に分かりやすくて綺麗な方法があるのか?
再帰つかうまでもなく、思いつくレベル $num=10; ($a,$fib)=(0,1); for (1..$num) { ($a,$fib)=($fib,$a+$fib): print "$fib\n"; }
711 :
507 :2010/07/02(金) 01:03:22
つまらない質問で済みませんが、色々探したんですが、 見つからなかったので教えて下さい。 Perlでテキスト出力をしたとき、通常はどんどん新しい行が追加されて 流れてしまいます。 出力場所を固定して、その場で出力を書き換える方法はどうしたら良いのでしょうか?
$|=1; for($i=0; $i<10; $i++){ print "$i\r"; sleep(1); }
714 :
507 :2010/07/02(金) 05:41:12
>>712 最初は、自分への返信ということも気がつかないところでした。
実行してみてよく分かりました。
キーワードは、復帰文字、特殊変数、バッファリングですね。
バッファリングはまだ理解が不十分なのでもっと勉強してみます。
ありがとうございました。
そういえばGoogleの「perl GoogleAPP」ってどうなったの? 凍結してんの?
Perl/Tk のインストールに失敗してしまいます。 環境は MacOSX Snow Leopard の X11 上で、 Perl のバージョンは 5.10.0 、Perl/Tk は Tk-804.029.tar.gz を使っています。 手順は perl Makefile.PL を行った後 make するだけで、make 時にエラーになります。 エラーは以下のようになっています。 /usr/bin/ar cr libpTk.a ClientWin.o Lang_f.o ... /usr/bin/ranlib: archive library: libpTk.a will be fat and ar(1) will not be able to operate on it /usr/bin/ranlib: for architecture: x86_64 file: libpTk.a(tclAsync.o) has no symbols : どうもファイルが多すぎて ar に失敗してるようです。 全 Makefile 内(結構ある)の ar を libtool に置き換えたらなんとかなるかもしれませんが、 このようなエラーが出てインストールできないという情報がネット上に特にないので、 そんなことをしなくても何とかなるのでしょうか? 何か知ってる方がいればお願いします。
$x = <STDIN>;$Data = <STDIN>;$y = <STDIN>; if ($Data eq "+") { $k = $x + $y; } elsif ($Data eq "-") { $x - $y; } elsif ($Data eq "*") { $x * $y; } elsif ($Data eq "/") { $x / $y; }; print $k; if文でDataに入力された記号を見分けてそれに対応した計算をしたいんだけど $kの中身がnullになるのはなぜ?
>>717 標準入力受けたら、ファイルから一行読んだら、chomp。
そして暇だから書いてみた。
foreach ($x, $Data, $y) {
chomp($_ = <STDIN>);
}
$k = ($Data eq "+") ? $x + $y :
($Data eq "-") ? $x - $y :
($Data eq "*") ? $x * $y :
($Data eq "/") ? $x / $y :
"non support" ;
print $k;
>>716 Macってのはx86の64ビットなのか?
それ、Windowsのじゃない?
PPCなんてとっくに捨てたよ
環境はx86の32ビットです。 なのに、確かになぜか -arch x86_64 が指定されているようですね・・・。 Snow Leopardだからということで、 64ビット版とのユニバーサルバイナリを作る設定になってるのかも。 CPANの設定が面倒くさかったので全部デフォルトのままだったのがマズかったのかもしれません。 明日ちょっと設定を見直してみます。ありがとうございました。
>>719 foreachってこういう使い方もできるのか。
$_に代入すると元の変数の値も変わるんだな。
配列で使うときには何も感じずに使ってたけど、なんか不思議な感じ。
$_に各変数のポインタが入るなら$$_としないといけないのに。
まぁ、特殊変数というぐらいだからあれか。
$_が特殊なんじゃ無い。 my $dat ; my $foo ; for $dat ($foo){ $dat = q{bar} ;} print "$foo\n" ; # => bar
なるほど、$_は単なる変数でforeachが代入処理をやってるってことか。 ($,, $\) = (", ", "\n"); @names = ('太郎', '花子'); foreach $name (@names) { $name .= 'くん'; } print @names; for($i=0,$name=$names[$i]; $i<@names; $names[$i]=$name, $name='', $i++, $name=$names[$i]){ $name .="さん"; } print @names;
namenamenamenamenamenamename
my $dat = q{ini}; my $dat2 = q{ini}; my $foo ; for $dat ($foo){ $dat = q{bar} ; $dat2 = q{aaa}; } print "$foo\n" ; # => bar print "$dat\n"; print "$dat2\n"; こんな風にすると、forのループ変数の特殊さが判る まあ、普通に効率のいいコードを作れば参照渡しにするから当然だけど
ループ変数$datのスコープがfor内に限られているってだけじゃない?
mapやgrepの$_もエイリアスだってこと忘れないであげてください my @list1 = qw(hoge fuga piyo); my @list2 = map { tr/o//d } @list1; print "@list1\n"; #=> hge fuga piy print "@list2\n"; #=> 1 0 1 (trで削除された文字数)
730 :
722 :2010/07/04(日) 12:20:40
CPANの設定関係なかったようなので Makefile を無理矢理置換して -arch i386 のみにするとインストールは成功しましたが、 実行しようとするとアーキテクチャが合わないとか言われてしまいました。 仕方がないので ar を libtool に置き換えて実行してみても、途中で失敗。 複数 -arch 指定してるとだめみたいなこと言われる箇所が。 gcc-4.2: -E, -S, -save-temps and -M options are not allowed with multiple -arch flags 仕方がないので -arch x86_64 のみにしてみたところ、うまくいきました。 Core 2 Duo って x86-32 と x86-64 の両方に対応していたんですね・・・。今頃知った。 そして、Snow Leopard は x86-64 モードで動いている・・・ということなのだと思います。 以上報告まで。
>>728 スコープとは少し違う
ループ変数はsortの$a $bみたいなガチアイデンティファイア
Perlのif倒置良いなぁ。 createWindow("パラメータ"); createShadow("パラメータ") if (useShadow); こういうの良いなぁ。
倒置じゃなくて修飾詞だけど、一切使わなくても書けるし、 それで不都合ないので、使わない方が保守が楽
倒置(とうち)とは、言語において通常の語順を変更させることである。
倒置じゃなくて後置って言うんだぜ 豆な
C言語に入っててもよかったよね>if文後置 つーか今からでも入れてほしい。
Perlは1文でも{ }が必要だから重宝するのであって Cには別になくてもいいと思う
それは本気で言っているのか?
XPで以下のプログラムを実行すると 〜‖|… と表示されるはずが ??|… と最初の2文字は"?"に変換されてしまいます。 どうも区点の1区にある文字でうまく変換できない文字があるようなのですが 何か設定が必要でしょうか? use Encode; $x = "\x21\x41\x21\x42\x21\x43\x21\x44"; # "〜‖|…" $y = Encode::decode('jis0208-raw', $x); print Encode::encode('CP932', $y);
cp932 でなくて shiftjis を指定してみる。
また波ダッシュか
>>741 ありがとうございます。shiftjisで出ることを確認しました。
cp932 と shiftjisでググってみたらUncode規格のバグ文字に当たる問題みたいですね。
cp932を使いたいのでcp932でも表示できるUTF文字に置き換えることにしました。
744 :
デフォルトの名無しさん :2010/07/06(火) 15:27:39
中身が被ってない配列を得たいんだけど、ハッシュに突っ込んでkeysが一番楽だよね?
List::MoreUtils::uniqを使わずにってこと? リストの順番が変わってもいいんならそれでいいと思うけど
とん。 問題なさそうだし、それで行く。
1. List::MoreUtils の中身そのまんま sub uniq (@) { my %h; map { $h{$_}++ == 0 ? $_ : () } @_; } # grepがこの様なケースの為に存在するのに何故mapで? 2. 定番 %h ; @uniq = grep { ! $h{$_}++ } @arr ; 3. ハッシュに突っ込んでkeys %h ; @h{@arr} = (1) x @arr ; @uniq = keys %h ; …手間は一番掛ると思う。
3番目の2行目って実行できなくない?
普通に出来るが?
出来なかった
perl -Mstrict -we 'my @arr = qw( 1 2 3 4 5 3 4 );my %h;@h{@arr} = (1) x @arr;my @uniq = keys %h;print "@uniq¥n"' 結果:4 1 3 2 5 perl 5.8.6で確認。だいじょb
twitterのライムラインではなくフォローしてる人の最新20件のつぶやきを取得できるモジュールってありますか?
これくらいしかミスり様が無いんだが @arr = 1 x 5 ; # => ( '11111' ) @arr = (1) x 5 ; # => ( 1,1,1,1,1) 自己フォロー my $c = my $d = ''; my @arr = ( 1,2,3,$c,$d,undef,undef,1,2,3); このケースを想定したら、自ずと2番以外の選択肢は消える grep をちょっと変更しなきゃならんけど
D:\>perl -Mstrict -we 'my @arr = qw( 1 2 3 4 5 3 4 );my %h;@h{@arr} = (1) x @arr;my @uniq = keys %h;print "@uniq\n"' Can't find string terminator "'" anywhere before EOF at -e line 1. This is perl, v5.10.1 built for MSWin32-x64-multi-thread
winのperlワンライナーはクォーテーションを変えなきゃダメだろ perl -Mstrict -we "my @arr = qw( 1 2 3 4 5 3 4 );my %h;@h{@arr} = (1) x @arr;my @uniq = keys %h;print qq{@uniq\n}" 環境が無いから実行出来るかは知らんけどさ。
通りすがりが
>>755 でやってみた
C:\> perl -v
This is perl 5, version 12, subversion 0 (v5.12.0) built for MSWin32-x64-multi-t
hread
[...]
# 一行で
C:\> C:\Users\foobar>perl -Mstrict -we "my @arr = qw( 1 2 3 4 5 3 4 );my %h;@h{@arr}
= (1) x @arr;my @uniq = keys %h;print qq{@uniq\n}"
4 1 3 2 5
めでたしめでたし
こういうときはベンチマークでどれが最速か比較する方向に話が進むのに、 なんでワンライナー自慢になって終わってるんだ?w
他人のベンチマークの結果はストックできないけど ワンライナーはストックできるから……じゃね
別に自慢じゃなくて他人がコマンドラインからすぐ試せるようにって言う 思いやりがそうさせたんだろう
while ( chomp(my ($id, $name) = split /,/, <FILEHANDLE>) ) 上の文のchompは何に対して処理しているのか教えてください
$idと$nameに対して、それぞれchompしてる。
ありがとうございました
>>747 の3.の2行目は@arrの各要素を%hのキーにして、
1が@arr個ある配列をそれぞれに代入しているようなのですが、
このハッシュに@を付けて{}の中にキー配列を入れる用法はなんと言うんでしょうか?
ハッシュ プレフィクス @ 配列 初期化などでぐぐりましたが見つけられませんでした。
スライス
>>764 ありがとうございます。
色々な例を見つけることが出来ました。
@arr=('hoge', 'huga', 'foo', 'bar', 'hoge', 'foo'); $start = (times)[0]; for($i=0;$i<1000000;$i++){ my %h ; my @uniq = grep { ! $h{$_}++ } @arr ; } printf "2.にかかった時間:%f\n", (times)[0]-$start; $start = (times)[0]; for($i=0;$i<1000000;$i++){ my %h ; @h{@arr} = (1) x @arr ; my @uniq = keys %h ; } printf "3.にかかった時間:%f\n", (times)[0]-$start; D:\>test.pl 2.にかかった時間:4.290000 3.にかかった時間:3.838000 あら3の方が早い
ブラックジャックで2枚の親のカードの内、1枚だけ表示させる書き方教えてください。 while ($#stack >= 11) { undef @myHands; undef @hisHands; push (@myHands, pop (@stack)); push (@hisHands, pop (@stack)); push (@myHands, pop (@stack)); push (@hisHands, pop (@stack)); print "MyCards:", join (", ", @myHands), "\n"; print "HisCards:", join (", ",@hisHands), "\n"; ↑ ここで親のカードを1枚だけ表示させたい! stackには51枚のカードが入っています。 お願いします。
>>767 一枚目だけ表示すればいいの?こんな感じ
print join(",", map { $_ ? "xx":$hisHands[$_] } (0..$#hisHands) ), "¥n";
>>768 ありがとうございます!
perl初心者の僕には難しすぎましたね・・・!
もっと色んな本を読んで、高レベルなプログラミングが出来るように頑張ります!
WinでのPerlの実行はCMD.exeからやってますかね? utf8の文字コードだと化ける・・。ググったらutf8でも表示する方法が載ってたけど Win2kだとダメでした。 binmode STDIN, ":encoding(cp932)";なんかも試したけど文字がたまに化けるなぁ・・・
unicodeのテキストって自由に読み書きできる? CRLFすら無いので、<>で読めるんだろうか
>>771 CPAN
↓
Perl core and CPAN modules documentation
↓
HTTP::Proxy in Modules Search
↓
HTTP::Proxy ↓
> Win32 PPM packages for "HTTP-Proxy"
> uwinnipeg Perl 5.10 repository [ v 0.24 ]
> uwinnipeg Perl 5.8 repository [ v 0.20 ]
>>772 バイナリでも読めるんだから、改行無くても読めるだろ。
読込んだ後にエンコードなりデコードなりしちゃえばいいし。
my $content = ’’;
open my $fh, "foo" or die $!;
binmode $fh;
{
local $/;
$content = <$fh>;
}
close $fh;
つまりテキストで読めないということか
UTF8なuse utf8;でおkだろ
>>つまりテキストで読めないということか binmodeの事かな? まあ、windowsでしか使わんからな。>binmode binmode指定しとけば、なんだって読めるよ。
符号化方式によるな
ActivePerlのバージョンは何で使ってますか たくさんあって選びにくい やっぱり最新のがいいんだろうか
枯れてきてるという意味で5.10が鉄板だけど 5.12でも問題ないと思うよ
>>780 WindowsでCPAN使いたいならActivePerlじゃなくてStrawberry Perlにするといい
インストールするだけでコンパイラとかも含めて必要なもの全部入るから何も面倒なことないよ
最近のActivePerlはMinGW同梱じゃなかったっけ?
5.8使ってるけど5.10が多いのか
自分で使いたいだけなら最新安定版 テスト環境として使うなら実運用先のバージョンに合わせる 人柱なら開発版でもなんでも使えばいいじゃない
ちょっとバージョンあげるだけで動かなくなるからな・・
選択基準はPPMにモジュールがあるか、無いか。 使いたいモジュールがPerlの最新版に無ければ古いのを使う。 モジュールが出た時点で最新版に移行するよ。
URI/QueryParam.pmモジュールが登録されているリポジトリを探しているんだけど どうやってググって探せばいいのかな。 モジュール類が登録されているリポジトリの探し方を教えてください
ちなみにActivePerl v5.8.0 の古い奴です・・
5.10を使っている人が多いので ActivePerl 5.10.1.1007を入れてみた。
バージョンあげるときは思いっきり動かなくなる可能性があるから古いのは残しておいて いつでも戻して置けるようにしておくことをお勧めする。結構安易にバージョンあげると面倒だよ
796 :
名無しさん@そうだ選挙に行こう :2010/07/11(日) 22:44:06
んなーこたーない。PHPじゃないんだから。
>>785 5.10.1.1007からはそうだね
>On 32-bit Windows CPAN shell automatically downloads and installs
>the MinGW GCC compiler
変数に入っているデータが 01 の文字列として入っている場合に 文字列 01 を数値の 1 に変換したいんですけど一番スマートな方法ってどんな感じで指定するのですかね?
>>798 文字列が10のときは二進の2にするの?それとも十進での10にするの?
>>799 すみません。十進での10にする予定です
全部十進で考えています
気にせんでも「数字として扱えば数字として扱われる」んだから、 文字列のままで良いんでねーの? 明示的にどーしてもやりたいなら、0足すのが一番スマートか? my $i = '01' ; print 0+ $i ; printf "%d\n", $i ;
>>801 なるほど気にしなくてもいいんですね
どうもありがとうございました
803 :
最強 :2010/07/12(月) 22:17:09
CPANから Pod::PerldocJp いれてperldocjp実行したけど文字化けしてしまう utf-8撰んで表示させてるんだけど perldocjp -f Option f needs a following argument! ???: perldocjp [-h] [-V] [-r] [-i] [-D] [-t] [-u] [-m] [-n nroffer_program] [-l] [-J] [-T] [-d output_filename] [-o output_format] [-M FormatterModuleNameToUse] [-w formatter_option:option_value] [-L translation_code] [-F] [-X] PageName|ModuleName|ProgramName|URL perldocjp -f PerlFunc perldocjp -q FAQKeywords perldocjp -A PerlVar -h???????????????????????????? ???"perldocjp perldocjp"???????? [PerldocJp v0.13 based on Perldoc v3.15] ってでてしまう sjisとかeucとかためしたけど全部????って表示される 誰か教えてください
-Tで適当な奴出力して問題なかったら、pagerの問題。 問題あったら、端末のエンコーディングの問題も加わる 何れにせよ、cpanのマイナーモジュールの質問を2chでしても あんまり有用な答えは帰って来んよ 普通にググった方は早いんじゃない?
Linux+perl5.7で コマンドラインから実行すればsystemコマンドがきちんと動作して Apache上でcgiとして動作させればsystemコマンドが-1を返して来てしまいます。 cgiでsystemコマンドを使うためには何か特殊な記述が必要でしょうか? Apacheのエラーログには特に何も出ていません。 コマンド自体は大したことしてなくて system("ls"); だけです。とりあえず今のところは。
>>806 >>1 CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perlの区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板:
http://pc11.2ch.net/php/ )
CGI の質問は答えが Perl と全然関係ない話に帰着する場合が
多かったりするので WEB プログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
>>807 失礼しました。
とりあえず自己解決しました。
お騒がせしました。
>>805 eclipes と EPIC だね。使ってるよ。ステップ実行できて超べんり〜
CPANの使えない環境でもDBIを使いたいので
CPAN Searchから以下のTARボールをダウンロード展開しました。
http://search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBI-1.611.tar.gz 展開したディレクトリからDBI.pmを取り出し、さらにlibの下からDBD, DBIを取り出して
自分の作業ディレクトリ mylib にコピーし、
use lib 'mylib';
use DBI;
my $dbh = DBI->connect(); #ドライバを指定していないのはわざとです
してみましたが、DBI.pmの265行目でコンパイルエラーがあると表示されて、当該場所を見ても
中括弧の終わりがあるだけで何でこけているのか判断がつきません。
CGI::Sessionモジュールや、Template Toolkitなどは、同じようにCPAN Searchから
拾ってきたものを展開して、ディレクトリ構成に注意してただしく配置し、use libしたら、
CPANが使えずに自前でライブラリを用意するしかない環境でも正しく動作しています。
ただ、DBIはTARボールを取ってきて展開して使えるような代物ではないのでしょうか…?
些細なアドバイスでも良いのでお願いします。
↑の者ですが、READMEにしたがって perl Makemake.pl; make & make install したらDBIはちゃんと動いているようですが、そうやってインストールした場合は DBI.so というライブラリが生成されており、異なったCPUアーキテクチャ上では 動作しませんでした… CPANはすべてPerlで書かれたライブラリだと思っていたのですが、これは勘違い ということでしょうか…?
Pure perl のモジュールもあるけど パフォーマンスのためにXS使ってるものはmake必要だよ そのためのCPAN
>>812 なるほど、今回はどうも仕方がなさそうですね…
勉強になりました。ありがとうございました。
>>809 凄い便利そうでそうですね。土日か暇なときに入れてみます
ありがとう
step実行がスゴイ!って何十年前の話してんだよ。
あれれ・・・step実行はもう古いの? じゃぁ今のトレンドは何?
emacs から perldebuger 使ってる俺の立場は…
819 :
デフォルトの名無しさん :2010/07/15(木) 17:22:43
ヒアドキュメントの部分を外部ファイルにしたいんだけど なんかスマートでかっこいい方法ない?
・HTML::Template ・Text::Template ・Text::MicroTemplate ・Template-Toolkit ・ClearSilver ・40 行で作るPerl用テンプレートエンジン MicroTemplate使うのがいいんじゃね
821 :
名無し :2010/07/15(木) 18:52:42
ダイヤモンド演算子<>のなかで <${$self}{handle}>ってやるとエラーのですが use strict; use warnings; package kuroppu; sub new{ return bless{ handle=>undef, }; } sub open{ my $self=shift; my $name=shift; $self->close(); open $self->{handle},$name or die "file open error:$!"; } sub read{ my $self=shift; my $fh=${$self}{handle}; while(<$fh>) { print; } } 1; $fh=${$self}{handle};ってやって while(<$fh>)ってやるとうまく行くのですが 上のwhile(<${$self}{handle}>)だとエラーがでてしまうんですが どうやって<>のなかでfhに代入させず入力させればいいですか?
>>821 できない。単純変数に代入するか、readline関数を使ってください。
<>は中にグロブのファイル名パターンも書ける関係で変な仕様に
なっております。
$pat = '*.c';
while (<${pat}>) {...}
みたいなのできるんで。
823 :
名無し :2010/07/15(木) 19:22:04
824 :
名無し :2010/07/15(木) 23:38:45
Perlでオブジェクト指向のカプセル化って微妙だけどなんなの???? >とは、言っても、Perlのカプセル化は、ガチガチではないので、 >カプセルの中に入ることができます。以下のことは、あんまりやってはいけないことです。 ってあるけどそうなの? オブジェクト指向とうたってるのに カプセル化とか曖昧だとむかついてくる
オブジェクト指向とかもモジュールとかリファレンスとかを組み合わせて実装したわけだしなあ そう言うのが嫌な人はPerl向いてないよ
826 :
名無し :2010/07/15(木) 23:56:30
向いてないよとかいうなよ〜〜〜〜〜〜^^
みんなはどんなモジュール使っている? 参考までにどんなものを使っているか聞きたいな
strictとwarningsを一番よく使ってるかな。
utf8も
断然、Mechanizeだな 便利すぎ
>>824 やろうと思えば覗けるけどカプセル化したい人は
覗くなってことさ。強制はしてないだけ。
WWW::Mechanizeのパッケージでデフォルトだと クッキーはどこに保存されますか?再読み込みとか保存とかどうなっているのだろうか
>>820 うちの環境は :: が使えないことが多いので
40行を改造して使うわ・・・
意味がわからねぇ
>>835 意味がわからないだろ?
俺にもなんでそんな環境でやらされんのかわかんないんだぜ
>>834 Text'Template
を使えw
>>824 何の引用?
ttp://www.rwds.net/kuroita/program/Perl_oo.html の事だったら、カプセル化の方法の説明は一切してないよ。
「perlのオブジェクト指向プログラムは、普通の状態だとカプセル化してない」
ってだけで。カプセル化したきゃ、自分ですれば良い。
(まあ、それでも他の言語と比べると…)
package Hoge;
use Scalar::Util qw(refaddr) ;
my %hash ; # dont use Grobal
my $code = sub {} ; # inner code
sub new { my $obj = bless \do{''}, shift ; $hash{ refaddr $obj } = shift ; $obj ;}
sub getter { $hash{ refaddr shift} ; }
sub setter { $hash{ refaddr shift} = pop ; return ; }
sub DESTROY { delete $hash{ refaddr shift } ; }
1;
package main;
my $obj = Hoge->new('hoge');
printf "%s\n", $obj->getter;
> :: が使えないことが多いので これがCPAN使うなモジュール入れるなっていうお達しなら、 perl使う意味が八割減ジャネーノ?
::が使えないってまさかperl4?
840 :
名無し :2010/07/16(金) 10:02:46
40行のテンプレートエンジンはやってること単純で 分かりやすいし使い勝手がいいんで改造して多用してる ありがたや
>>840 せっかく Perl付属のドキュメントがあるんだから
まずは手近なところから perldoc で少なくとも
perlboot
perlobj
perltoot
perltooc
perlbot
を読んで、理解出来ない部分を確認してから
他人に尋ねた方が良くないか?
>>843 Cに満たない言語も多いので油断は禁物です
Template-Toolkitは非XS版もあるじゃん。 「::」も無いし
Config::Multiって凄い便利だな お前らちゃんと使ってるか?
俺は、Config::Auto派だな
WWW::Mechanizeでfirefoxのクッキーを共用させたいんだけど どう書けばいいんですかね? そしてfirefoxのクッキーが見当たらない場合は処理しないようにしたい
firefoxのcookieファイル読み取れよと、
Mechanizeなんか敷居が高すぎる
0行のテンプレートエンジンなんてあるのか
あれはネタにしてもセンス無いなと思った
>>853 やる気が出ないので却下
XMLを適当にパースすればいいだけだろJK
今はcookies.sqliteになってる ある意味XMLより簡単だな プロファイルフォルダを探す方が面倒なくらいだ
sqlitewwww パースする必要すらないじゃねえか
どうすりゃいいんだ
あるブロックを5分間だけ実行させたいとかどうコード書けばいいんですかね 具体的に教えてもらえるとありがたい・・
タイマーを5分後に設定して割り込みを発生させる 割り込みルーチンでスリープモードに移行させる
メジャーブラウザのクッキーを利用してくれるパッケージ作ってくれればいいのにな
863 :
591 :2010/07/18(日) 08:25:55
>>861 ありがとう。さっぱりわからないから調べてみる
レンタルサーバでMySQLもSQLiteも使えない状況なんですが、 なんかいい代替手段はないでしょうか? リレーションはなくてもなんとかなるので、DB_Fileを検討しているのですが、気になるのが SELECT * FROM t ORDER BY key LIMIT 10; みたいなことをするには foreach $key ( sort keys %hash ) しかないですよね? レコード数が数万になるとちょっと嫌な感じがするのですが。
>>863 おお。そんなものがあったとは
どうもありがとう
>>865 最初からDBをわければよくね?リレーションないんでしょ?
868 :
デフォルトの名無しさん :2010/07/18(日) 12:59:10
レンタルサーバでもSQLiteくらい使えるんでないの? MySQLみたいなデーモン型でポートを専有するタイプは無理だろうけど。 VMwareか何でレンタルサーバと同じOS環境を作ってSQLiteをインストールして、そのバイナリをレンタルサーバにアップロードすればOK...と思うよ。
869 :
865 :2010/07/18(日) 13:17:37
>>867 1000レコードぐらいずつDBを分けるということですか?
それは管理が非常に大変かつ不整合が生じやすいような。
1レコード1DBだと、主キーをファイル名にして、レコード内容をテキストファイル
にするのと大して変わらないですよね。その方が編集・閲覧は簡単だし。
なので、DB_Fileって便利なように思えて使える局面がかなり限定される気がしています。
>>868 古いレンサバなのでDBD::SQLiteが入ってないんです。
原理的には可能でしょうが、セグフォりそうで…
500行ものテキスト上げるのはいいけど それ見せてどうしようって言うんだ。 あれこれ悩んでごまかし技使うよか サーバ代上乗せしてSQLマトモに使えるのにすりゃいいじゃん
自前でドメインとってない場合 URLが変わるのヤダヤダとか色々事情があるんだよたぶん
無料鯖のatpagesとかでもSQL使えんだから別の鯖にしろよ。 そしてスレ違いだ。 テンプレぐらい見ろクズ。
874 :
名無し :2010/07/18(日) 14:56:10
>>873 Perlコミュニティの人たちは、率直にいって、地球上で最も親切な人たちである。
Perlコミュニティの人たちは、率直にいって、地球上で最も親切な人たちである。
Perlコミュニティの人たちは、率直にいって、地球上で最も親切な人たちである。
Perlコミュニティの人たちは、率直にいって、地球上で最も親切な人たちである。
Perlコミュニティの人たちは、率直にいって、地球上で最も親切な人たちである。
Perlコミュニティの人たちは、率直にいって、地球上で最も親切な人たちである。
Perlコミュニティの人たちは、率直にいって、地球上で最も親切な人たちである。
Perlコミュニティの人たちは、率直にいって、地球上で最も親切な人たちである。
Perlコミュニティの人たちは、率直にいって、地球上で最も親切な人たちである。
Perlコミュニティの人たちは、率直にいって、地球上で最も親切な人たちである。
Perlコミュニティの人たちは、率直にいって、地球上で最も親切な人たちである。
残念。ここは2chだ。 テンプレを読まない厨房に厳しい。
地球上で最も親切な一方で 「自分でぐぐったらすぐ答えが出るのに、わざわざなんで質問するの?死ぬの?」 とか言う人たちでもある
英語ならググると出てくるが日本語あんまりねえんだよな・・・
英語読めよ
日本語じゃないとまったく話にならないよな
>>869 その「大して変わりない」方法でまずは実装したらどうだろう。
検索処理部分なんてブロック化してメインから追い出せるんだから
あとでSQL使うように直してもそこだけ差し替えが利くだろ。
882 :
デフォルトの名無しさん :2010/07/18(日) 18:17:05
だろ だな クズ とか大人ぶってるやつは 好きな音楽 ジャズとかクラシック 好きな酒は黒ビールとかほざいてる大人病だろバカが!
>>860 直列な処理でいいなら
LWPのリクエストをタイムアウトさせる定番処理を応用すればいいんじゃね
こんなやつ
my $TIMEOUT = 60 * 5;
eval {
local $SIG{ALRM} = sub { die 'timeout'; };
alarm $TIMEOUT;
$response = $ua->request($request);
alarm 0;
};
unless ($@ =~ /timeout/) {
if ($response->is_success) {
return $response->content;
}
}
>>860 こういう高度なコードが考えられる
ラベルTIMEOUTからifまでが目的のブロック
do-whileでも問題なし
好みでsleepの秒数を延ばしてもいい
sleepが無いと恐ろしいことになる
main () ;
sub main {
my $min = 1 ;
my $timeout = time + 60 * $min ;
TIMEOUT: {
print "sleep.\n" ;
sleep 5 ; # 5sec.
} if ( time < $timeout ) { goto ("TIMEOUT") ; }
return 1 ;
}
885 :
865 :2010/07/18(日) 22:40:13
サーバをどうこうしろとかいう提案を求めているんじゃない。 Perlでの解法はないかと聞いているんだ。この馬鹿どもが。
886 :
865 :2010/07/18(日) 22:44:36
>>881 失礼、見逃していました。助言ありがとうございます。
「大して変わりない」方法も依然検討中です。
>>885 BDBならある意味キーはソート済みなので
ソートに時間かかるとかそういうことはないです。
なので数万件程度なら別に大したことはないです。
あ、BTREEで使うのが前提で
>>883 >>884 丁寧にコードまで考えてもらって感謝です。ありがとう
参考にして組み込んでみます。
>>885 > CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
> CGI と Perlの区別がつかない人も WEB プログラミング板に行ってください。
消え失せろゴミ
まあ、聞いてもないことを返してくる人いるよね 俺の聞きたいのはそれじゃねえ 日本語分かってるのかお前ってやつ
板違いぐらい誘導しろよクズども
>>891 逆上すんなゴミ
違うよ
同一人物だろうな
お前の目は節穴か
そういえばそろそろ夏だったなあ
Perlってどれだけパッケージを知っているかで全然違ってくるね そのパッケージで苦労しているだが
パッケージじゃなくてモジュールでしょう
ホームページのhtmlを丸ごとゲットするパッケージで一番軽くて
早くゲット出来るモジュールってなにかな?
HTTP::Liteあたり ?
>>903 ありがとう
速度にかわりがないならインストールが面倒だから
LWP::Simpleあたりでやってみようかな
wgetがあるよ。 一番ラクな方法あるならperlに限らずコレを勧める。
>>900 いいよな。うちは標準のすらまったく使えないんだが、私は元気です。
WWW::Curl::Easyっていうのか結構早いんだな
質問です Perlから、現在既に実行中のfirefoxのウィンドウに 新しいタブでページを開くにはどうすれば良いのでしょうか? OSはMacOSX Snow Leopard、Perlはv5.10.0です
912 :
デフォルトの名無しさん :2010/07/21(水) 11:51:52
>>911 WWW::Mechanize::Firefox
インストールの方法とか使い方は自分で探してね。
ありがとうございます モジュールなしで行う方法があれば一番良いのですが、 なければそれを使わせていただきます
モジュールありで行う方法が一番いい方法だろ 速度的にも
ちょっと互換性の問題がありまして、 なるべくなら実行ファイルを叩いて開けるならそれが一番良いのです 今までWindowsのみで使われているプログラムで、 Windowsだと問題ないようなのですが、 Macで動かしてみると二重起動できないとか言われてしまいまして・・・ モジュール使うしかないようなら 実行ファイルの代わりにモジュールを使うこともできる仕様を追加するつもりなので それでも問題ないと言えば問題ないのですが、 なるべくなら仕様変更が小さい方がいいかなと まあ仕事ってわけじゃないので(オープンソースのツールの改良) 仕様変更しまくって怒られるわけではないのですが
っと、ありがとうございました
920 :
デフォルトの名無しさん :2010/07/22(木) 00:07:36
ユーザー名隠すとかダサ 久しぶりにObjective-Cやったけど メモリ管理とかほんとくそ メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣) メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣) メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣) メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣) メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣) メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)
921 :
デフォルトの名無しさん :2010/07/22(木) 00:36:31
オレはPerlという重力が0.5倍で暮らしてきずいた・・・ perl星の敵は楽勝だろうとなめていた この星では通訳者がメモリ管理してくるし・・・すみごこちがよかった そして地図を片手にwebアプリの洞窟へむかつのであった 途中には $や@,%みたいな意味分からないオブジェクトが散乱していた 向かう途中 use strict + use warning兄弟というやっかいものが参上してオレの行く手をはばんだ・・・ オレは必死にアロー演算でつきまくって攻撃してもやつらの 怒鳴り声はとまらない myとかいわないと 自分の名前を名乗れとかほざかれて怒鳴られて殴られる この兄弟を無事に倒すと楽な道に進めるが こいつらを相手にしないと、過酷な道で遠回りになるときいた・・・ そして歩き続けた 途中でCPANというお店に立ちよって武装するが、LWPが人気なのでそれをかっといた さまよってるうちに、製作所みたいな場所にたどりついた・・・ なんかオブジェクトといってモノをつくっている オレ「なにつくってるの???」 ???「newつくってんだよ・・・」 オレ「そんなの作る必要ない そこらへんにおちてる」 ???「この星ではnewは自作しなくちゃいけないんだよ・・・」 オレはよくわからずとりあえず webアプリの洞窟まですすんでいった・・・ この国はおかしいときずきはじめた・・・道ばたで土下座してる人がいた さっきの街でみかけた ???という金の仏像の方角をむいて 皆おがんでいるのである 薄々きがつきはじめた 宗教なんじゃね?って なんかcatalystとsledgeっていう伝説の剣があるらしくて それは困難をくぐりぬけた者しか抜けないのであるときいた オレはそれを抜こうとしたが ピクりともいわなかった もうオレはつかれたから宿でねることにした
924 :
デフォルトの名無しさん :2010/07/22(木) 10:55:06
オレは目が覚めた・・・ ふと思った。 この星にきてまだ1日目 自分が最初にいった C星にいたときとの重力が違いすぎて体が弱くなった C星の時に、宇宙旅行でObjective-C星の旅行プランを立てて雑誌等を見てみて 良いなーって思っていたのであった っで2年前に、Objective-C星に言ったときは、オブジェクト指向という街の方針をよくよんでなくて住み心地がわるかったのである・・・ その理由は家にすんでいた時に、その星はおかしく 夜中になると毎日dealloc大魔神という破壊神が家を壊しにくるのだ・・・ だからretainという魔法を使って星の住民は毎晩家をまもっている そして朝に魔法を解除しないと外出ができなくなる そのためにreleaseという魔法をつかって結界を破壊するのである。 そんなめんどくさい星にはいたくない!という過去の事を思い出した 悩んでる結果 Perl星への旅行が決まったのである、その結果が今である。 今現在はまだ慣れてないだけであって苦労している。そしてwebアプリの洞窟を目指している途中 MySQL大図書館という所に立ち寄る そこは膨大な本が置いてあり、一人の魔法使いらしき男が「select! insert!」などと杖をもって叫んでいるのである オレ「ほ〜〜〜こうやって本を魔法であやつっているんだ」と思いみていた そしたら横にいる戦士っぽい人が「param! fetch! サニタイジング剣法!!」といって本をばしばし切り裂いている すごいと思い話かけてみると、「XSSって言う危険な生物が入り込んでる場合があるからね」1回本を切り裂いてチェックしてるんだよ 戦士「もしかして、君はwebアプリの洞窟にいくのか?」 オレ「うん」 戦士「よかったらこれをもってくんだ mod_perl2のお守りだ これをもってれば洞窟の強力な磁場に耐えられる もってないと体が張り付いて重くなるんだ」 戦士「あとこれもだ DBIの剣 CGI.pmの盾 MySQL図書館の受信機 これくらいあれば安心して探索くらいはできるだろ 健闘を祈る」
925 :
デフォルトの名無しさん :2010/07/22(木) 11:07:52
オレは進んでいった 進んでいる最中に すごいでかいモンスターがでてきた ???「我はハッシャー・・・ お前がここを通るなら我はお前を倒す」 オレ「さっきもらった 武器があるからいける!!」 オレ「hassher?attack=9999999&fireelement=100&send='%20%00login.html」 ハッシャー「そんなもの効かないよ バリバリ はははははは!!!」 オレ「!!!・・・」 ???「しねえ!!ハッシャースライス!!! ブハンブハンナウブハン!! (岩がまっぷたつ」 オレ「なんだあれは?! やばいほんとに よけないと」 と思って避けたが 足にヒットしで大けがをして動けなくなってしまった オレはwebアプリ洞窟にいくまえに訓練場にいっておけばよかったと後悔して ハッシャー「氏ね!」 おれは死を覚悟した・・・ そのとき!! ???「くらえ・・・」 ???「念のため・・・$SIG[ALRM] alerm 20 xxxxx」 ???「killall -hasher・・・ rm -rf ps aux 完了」 ハッシャー「うわああああああ!!グアアアアア!体が やめろ・・おまえは・・・」 ???「PSGI PSGI・・・ node.jsハッ!!!」 ハッシャー「苦しい 毒がからだに・・・」 ???「これで終わりだな・・・」 ハッシャー「うははははお前もこれで道ずれだ、ハッシュ解放・・・」 ハッシャーの腹から沢山のモンスターが溢れかえった ???「20秒経った」といったあと 一気に沢山のモンスターが消えていく オレ「助けてくれてありがとう」と言おうとしたら姿を消していた 近くにいた老人「あの人たちはPerl大国ジパンーグを守る JPAギルドの聖騎士たちじゃよ そりゃ強い その強さは・・・」
926 :
デフォルトの名無しさん :2010/07/22(木) 14:36:53
ネット閲覧専用のAndroid端末ってないの?
意外と面白くてワロタ
928 :
デフォルトの名無しさん :2010/07/22(木) 17:24:16
そしてオレは そのギルドJPAの後をおった・・・そしたらだんだん気が遠くなってきた 気がついたらパソコンの前にいた、今までのは夢だったのろうか いやちゃんと痛みもあった 時計をみてみたが 全然時間が経っていなかったのである。 とりあえず気にせず Perlの勉強をしようとしたら 本が見当たらない オレ「じゃあ インターネットでPerlしらべるか〜」 カタカタ・・・ オレ「あれ?Perlの情報がヒットしない でてくるのは真珠とかだけだ プログラミング perlでもでない」 なんかおかしい 異変にきずいた JPAのサイトを見に行ってみたがそんなサイトは無かったのである オレ「もしかしたら・・・ この世からPerl言語が消されたのか!!?」 オレ「夢らしき世界の最後の時に、???と名乗る人物が「この星には未来がない 立ち去れ・・・」といっていたのを聞いた気がする」 消えてるっておかしいだろ?!そんなことはあるはずない と思いツイッターでPerlをやっている人のページをみた 口をそろえてこういっている 「Python最高!」といっている これは何かの間違え ツイッターでPerlはどう?と質問したら Perlってなに?と回答される オレはおかしさのあまりIRCにいった そしたら 「俺も変な夢をみた Perl星という世界で、敵に襲われていた旅人を助けた」 「Perlがこの世から消されているきがするんだけど」と会話しているのがきこえた」 どうやら記憶がある人たちがいるようだ でも問題は、どうやって記憶を取り戻すか この星に言った人たちはPerlプログラミングの作業中に突然意識を失って perl星へいったといっている pythonとの因果関係 なにかが裏でこの世界をpython色で染めようとしているのかもしれない そして俺ふくめperlコミュニティの人々は立ちあがる・・・
929 :
デフォルトの名無しさん :2010/07/22(木) 17:39:17
これ以上むずかしくておもいつかねえ〜
これ、売れるんじゃね?
921先生の次回作にご期待ください!!
オライリー・ジャパンに売り込むのがよろし 実用Perlプログラミングの次の版に、息抜きのページとして、入れてもらおうw
意外にもワロタ
934 :
デフォルトの名無しさん :2010/07/22(木) 21:27:32
そして俺たちは、夜の9時ちょうどに Perlの勉強をして再びPerlの世界へ行こうと約束をした 待ち合わせはMySQL図書館にした・・・ よしパソコンの前で勉強を開始・・・ そしてだんだん気を失っていった オレ「あれ?・・・ここはどこだ 凄いグルグルまわっている 何かがおかしい」 オレ「break!!!」 回転がとまった・・・ しかし、そこは一面真っ暗で何も見えない グォオオオオオ・・・・と何かのうめき声が聞こえてくる 怖くなったのでひたすらおびえながらかがんでいた。でも早くIRCの人たちを捜さないとと困り果てていた っとその時、突然誰かの声が聞こえた ???「取りあえずここは居てはまずい 他の場所へいこうか 少し目をつぶってくれ」 ???「go to MySQL Library・・・」 オレ「すげえワープだ こんな能力があるとは・・・」 アーヘン「自己紹介遅れました 私の名前はアヘン IRCからきました 一応魔法使いです」 オレ「よろしく 俺は戦士みたい・・・魔法とかあんまつかえないし」 アーヘン「では MySQL図書館へと参りましょう」 そしてMySQL図書館へ・・・ アーヘン「なんていうことだ 図書館が崩壊している これはどういう事だ」 オレ「なんか地面や空間が歪んで見える・・・」 ジパンーグ兵「旅の人ですか?! 危ないです!! 向こうの方で巨大なメモリリークが怒っています!!逃げてください!」 オレ「メモリリーク?この星ではどんなかんじなんだろう・・・」 ジパンーグ兵「この世界では地面、物体などが全てメモリという見えない空間に格納されてできています メモリリークが起きたらそこの空間が崩壊しはじめ異次元へと飲み込まれてしまいます!!」 オレ/アーヘン「?!」 アーヘン「このままではまずい 一時テレポートしよう・・・ 目をつぶって・・・ go to mixser・・・」 アーヘン「おかしい 魔法が使えない どういうことだ!!!!!!」 ジパンーグ兵「もう終わりです・・・うああああ・・」
935 :
デフォルトの名無しさん :2010/07/22(木) 21:40:19
ジパンーグ兵がのみこまれてしまった オレ「やばい・・・ 解放!解放!」 だめだ全然解放されない 力が足りなさすぎる アーヘン「逃げた方が良い!!」 オレ「飲み込まれる!!! うあああああ!!」 誰かの声「まだ死んではいかん・・・グルウルルル・・・ お前に力をやろう 逃げろ お前は臆病者だ!!」 オレ「だれ?だれなんだよ!! なんだなんだ力が湧いてくる なんだこれは 体が再生している 早く逃げないと!!!」 シュルルルルルルル・・・ドロンッ 伝説の魔術師「dmesg... mysqlLibrary near memory Liberating!! kill 112」 伝説の魔術師「とりあえず治まりましたね topでプロセスを監視していたんですがメモリの異常事態にきずいてやってきました」 オレ/アーヘン「あなたは?・・・」 伝説の魔術師「私はミーガワ ではごきげんよう」 ドロンッ・・・ 近くに居た老人「フォフォフォフォ・・・彼もここまで成長するとはの」 オレ「あなたはさっきも居た 誰なの?」 ンケト大王「フォフォフォフォ 気にするな ワシは ンケトワールドの元大王でな ワシの魔法はもう古いのじゃよ」 アーヘン「あなたがあの有名なンケトワールドの大王様? 私はあなたのweb魔法を参考にして学んできました」 アーヘン「あえて光栄です!」 ンケト大王「ッフォフォフォフォ まあガンバリたまえ 君等にCGIの大魔法を与えよう・・・ アンガタエ!!」 ンケト大王「param escape redirectなどが使えこなせるはずじゃ・・・」 オレ/アーヘン「ありがとう!」 ヒヒーン!!パカパカ 馬の走る音が聞こえる JPA隊長「遅かったか・・・ もう解決していたのか」 mixser隊長「やつの仕業か」 ライブア隊長「ああ・・ やつだな」 続く・・・
つまんねーから他所でやれよ 調子のんな
何度読み返しても素晴らしいと思うんだが。 Perl初心者がたどるであろう部分を的確に表現していると思う。
ンケト大王に目頭が厚くなった
256倍シリーズのコラムならイける
ここは質問箱。 面白いか面白くないかも関係無く、単なるスレ違い。又は板違い。 要するに、 VIP でやれ。
やっとNG完了した
943 :
デフォルトの名無しさん :2010/07/23(金) 10:47:48
シネ
944 :
デフォルトの名無しさん :2010/07/23(金) 10:50:56
>>942 てめえみたいなクソガリチビはゴミみたいな発想しかできねえんだろ?
頭湧いてんのかおまえw死んじまえよザコ
なあ?てめえ書いてみろよ雑魚
おいクソガリちゃんよクソみたいなPerl書いてんだろゴミ
てめえのクソコードなんてゴミPerl書いてるお前にNGされる筋合いはねえんだよざこ
ケトルベル60kgで頭ぶっ叩かれたら死にそうなクソガリクソチビは死んどけ
これが夏厨なら致し方ないがある程度知識ある奴が壮大にぶっ壊れてるのが切ない
引き際って大事よね
デスマって恐ろしいな…
948 :
デフォルトの名無しさん :2010/07/24(土) 00:29:35
>>945 切ない
1 悲しさや恋しさで、胸がしめつけられるようである。やりきれない。やるせない。「―・い思い」
>>945 946 947
君たちスレチ
WWW::Mechanize::Firefoxをぐぐって見たけど明らかに 日本語の資料は少ないね・・・。スクリーンショットぐらいかな
>>863 もしかしてこれってcookies.txt のfox2しか対応してない?
3のcookies.sqlite だとダメかな
節穴かよ 説明読めばちゃんと対応してるの明らかに分かるだろ
952 :
デフォルトの名無しさん :2010/07/24(土) 12:55:17
死ねよ
せっかくのsqlite何だから自分でやればいいだろ
そうっしょ
ありがとう。そうなんか どおりで動かないはずだ
959 :
デフォルトの名無しさん :2010/07/24(土) 20:00:19
無名配列のサイズの取得について質問です。 以下のようにすると、ARRAY(0x1fa7d48)と表示されて、 サイズ(要素数)が取得できませんでした。 取得する方法を教えてください。 $arrayRef = [1, 2, 3]; print scalar $arrayRef;
scalar @$arrayRef
961 :
デフォルトの名無しさん :2010/07/24(土) 20:14:24
>>960 それもやってみたのですが、0と表示されてしまいます。
>>960 勘違いしてました。
無事、取得出来ました。
ありがとうございます。
どう見てもスカラーなコンテキストなのに、@a + 0 とかしないと ちゃんと動かないことがある
964 :
デフォルトの名無しさん :2010/07/26(月) 16:53:07
Perlで、PHPのob関数のような出力制御ができるモジュールなどはありますか?
965 :
PHP最強戦士 :2010/07/26(月) 16:59:13
ありますよ!!
もちろん用意してございます。
967 :
PHP=クソ(笑) :2010/07/27(火) 00:36:31
今後、コンピュータ関連の著作物・表現物等に対しては、「Perl (R) は株式会社テラ・インターナショナルの登録商標です。」
と表記くださいますよう、宜しくお願い申し上げます。
--
http://an.to/perl_tm こいつなんですか?教えてください!!
>>967 こいつだけは人生破滅させてやろうと思った。
それには触れないお約束
972 :
デフォルトの名無しさん :2010/07/27(火) 01:59:59
うんこをうんこっていったら、 じぶんがうんこにされたよ! ハ_ハ ('(゚∀゚∩ されたよ! ヽ 〈 ヽヽ_)
974 :
デフォルトの名無しさん :2010/07/27(火) 07:42:36
>>967 以降全員スレチしね^^
940 :デフォルトの名無しさん:2010/07/22(木) 22:20:21
ここは質問箱。
面白いか面白くないかも関係無く、単なるスレ違い。又は板違い。
要するに、 VIP でやれ。
おめえもスレチだろ?しねよ 悔しいのか?凄い書き手が誕生して御前くやしがてんだろ?
そしてしね
975 :
デフォルトの名無しさん :2010/07/27(火) 08:13:18
朝から御前等ゴミみるとむしゃむしゃするんだよね^^; 早くこのスレ潰れないかな
性欲がたまってんだろ オナれ
977 :
デフォルトの名無しさん :2010/07/29(木) 13:43:44
PerlとSQLiteを勉強中なのですが、なかなかうまくいかないため質問させてください。 PerlでSQLiteを使い、ログを取るというものを作っています。 PerlでData::Dumperを使い、そのDumperの出力をレコードに追加したいのですが、 my @Str = Dumper ( $entity); my $insertLog = "insert into lLog ( time, log) values ( $time, \@Str)"; $timeは追加されるのですが、@Strがnullになっています。 どのようにすれば挿入することが出来ますでしょうか?
掲示板もどきを作っているのですが、timeを使って投稿IDを生成しているので 1秒間に1件以上の投稿があった際に問題が起きてしまいます。 この問題は一般的にはどうやって解決しているのですか?
Time::HiRes
IDなら普通に投稿者のIP使えよ……
あと、これな
CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perlの区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板:
http://pc11.2ch.net/php/ )
982 :
PHPオタク :2010/07/29(木) 15:30:11
ぼくみたいなばかでもCGIのくべつつきますよ ぼくは30ねんかんPHPつかってるにーとですが
>>978 while ( -e $file ) { ファイル名変更処理 };
とか
alarm前提で
1秒に数十回アクセスあるんだよ! とかならごめん。俺専門家じゃないからわかんね
>>980 それじゃ同一IPで二回目以降投稿出来ないだろ・・・
投稿IDを100個/秒作ってpush、 受付順でpopすりゃいいじゃん
スレ違いだからやめろ
>>977 SQLクエリに直接変数を代入するのはやめれ
プレースホルダを使おう
my $sth = $dbh->prepare('INSERT INTO lLog (time, log) VALUES (?, ?)');
$sth->execute($time, \@Str);
あと\@Strだと参照を挿入することになるけどいいの?
join "\n", @Strの間違いじゃなくて?
>>986 この問題は
1)Perlは秒単位でしか時間が取れないのか?
2)大量に作成するファイル名、重複を避けるにはどうする?
と分解できるから、入り口がCGIでもPerlの処理の話とみなせるだろ
俺は見てて参考になったぞ
>>988 関係ない
CGIならwebプログラミング板
ある条件によってuse Hogehogeしたりしなかったりを制御することはできますか。 use Hogehoge; するのが重いモジュールがあって、必要な時だけuseしたいのですが、どうやったらいいのかわかりません。 if (条件) {
use Hogehoge; } とすると、条件によらず Hogehoge が読み込まれてしまうようです。
if (条件) { eval 'use Hogehoge;'; }
>>991 それで行けました。ありがとうございます。
もうひとつ質問ですが、Hogehogeがuseされたかどうかを調べる方法はありますか。
今は
unless (defined($Hogehoge::varname)) {
eval 'use Hogehoge;';
}
としていて、これはこれでうまくうごくのですが、もっとうまいやり方があれば教えてください。
if ( exists $INC{'Hogehoge.pm'} ) とか
すみません、%INCを教えてもらって感謝なんですが、質問があります。 %INCのキーはファイル名ですが、ファイル名の区切りはどのプラットフォームでも「/」でしょうか。 今は unless ($INC{'Foo/Bar/Baz.pm'}) { eval 'use Foo::Bar::Baz;'; } としているんですけど、 %INC のキーに指定している Foo/Bar/Baz.pm が、他のプラットフォームでも使えるのかどうか心配です。 よろしくお願いします。
996 :
PHPオタク :2010/07/30(金) 13:42:09
グ
997 :
PHPオタク :2010/07/30(金) 13:43:31
グ
998 :
PHPオタク :2010/07/30(金) 13:45:29
レ
999 :
PHPオタク :2010/07/30(金) 13:46:14
カ
1000 :
PHPオタク :2010/07/30(金) 13:46:54
バ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。