1 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 22:54:12 ] "The duct tape of the Internet" こと、Perlについての質問箱です。 "There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。 CGIについての質問は板違いです。WEBプログラミング板でどうぞ。 CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。 (WEBプログラミング板 pc8.2ch.net/php/ ) CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。 このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。 スレ違いの質問にはスルーか、速やかな誘導をお願いします。 www.perl.org/get.html ● 2006/12/21現在の最新版: 5.8.8 ● 2006/12/21現在の開発版: 5.9.3 前スレ Perlについての質問箱 29箱目 pc11.2ch.net/test/read.cgi/tech/1166708139/ リンク集は>>2-3 過去スレは>>4
302 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 10:56:55 ] >>300 そのとおり。適切な指摘ありがと。書いてから気がついた。 >>283 か、 s|(\d\d)(?=\d)|$1/|g みたいな感じで。
303 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 22:59:05 ] ファイル出力の質問です open IN , ">$failename"; print IN , "test; close IN; で、$filenameに絶対パスを入れたいんですが、なんかうまく言ってくれないんです Orz 助けてエロい人
304 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 23:02:26 ] >>303 > で、$filenameに絶対パスを入れたいんですが、なんかうまく言ってくれないんです Orz さあ、「なんかうまく言ってくれないんです」の「なんか」を推定するクイズです!!
305 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 23:08:28 ] これは流石に釣りだろう
306 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 23:11:10 ] エスパーの私がお答えしよう。 Windows で \ 記号がディレクトリ名の区切りなもんだから ダブルクォーテーションで括っただけだとエスケープと 解釈されちゃって変な文字列完成。→オープン→エラー。 そんなファイルはねえよヴォケと $! に入っている。
307 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 23:34:21 ] $failename (フェイルエネーム?) だからではないか・・・なんてことはないか。 そもそも IN じゃなくて OUT だろうと use Fatal qw(open close); open my $out, '>', $filename; print {$out}, "test"; close $out;
308 名前:307 mailto:sage [2007/04/19(木) 23:39:40 ] - print {$out}, "test"; + print {$out} "test";
309 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 23:40:55 ] {$out}
310 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 23:54:37 ] {$safe}
311 名前:265 mailto:sage [2007/04/19(木) 23:58:02 ] $failename =~ s/^/zettaipath\/;
312 名前:303 mailto:sage [2007/04/20(金) 00:05:38 ] みなさま マジでありがとうです こんな初心者をささえてくれてありがとお つω;
313 名前:デフォルトの名無しさん mailto:sage [2007/04/20(金) 01:32:59 ] なんかうまく言えました
314 名前:デフォルトの名無しさん mailto:sage [2007/04/20(金) 03:42:05 ] うまく言えないけれど宝物だよ
315 名前:デフォルトの名無しさん mailto:sage [2007/04/20(金) 03:53:44 ] 僕たちはできる!! できるんだ!!
316 名前:デフォルトの名無しさん mailto:sage [2007/04/20(金) 03:54:26 ] 最高ですか!!? 最高です!!!
317 名前:デフォルトの名無しさん mailto:sage [2007/04/20(金) 12:14:51 ] プラス思考のスレはここですか?
318 名前:デフォルトの名無しさん mailto:sage [2007/04/20(金) 15:30:27 ] プラス指向プログラミング POP
319 名前:デフォルトの名無しさん mailto:sage [2007/04/20(金) 19:25:20 ] @http = $_ =~ /s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+/g; print FILEA @http; このような記述をしたら、 Variable "@http" is not imported at http-client.pl line 53. Variable "@http" is not imported at http-client.pl line 54. Global symbol "@http" requires explicit package name at http-client.pl line 53. Global symbol "@http" requires explicit package name at http-client.pl line 54. と言われました。 これは何のエラーですか!?
320 名前:デフォルトの名無しさん mailto:sage [2007/04/20(金) 22:19:47 ] @httpを括弧でくくってください
321 名前:デフォルトの名無しさん mailto:sage [2007/04/20(金) 23:21:12 ] >>319 Variable "@http" is not imported については、perldiagをどうぞ。 というか、「何の」もなにもperlが出しているエラーなんだからまずはここで調べるべし。 つ perldoc.jp/docs/perl/5.6.1/perldiag.pod とりあえず、use strictなのに @http が生で使われているのが原因ですので、パッケージを明示的に 指定して使うか、my宣言すればいいのでは。
322 名前:デフォルトの名無しさん [2007/04/21(土) 23:17:55 ] PDFを解析したいんですが、どのような方法で読み込んでいったらいいと思いますか? ちなみに、PDFの仕様として: ・改行文字はCR,LF,CRLF,のどれでもよい。 ・文字列内での改行文字はそのままのかたちで残さなければならない。 ・文字列内で(見た目のために)改行したいときは \改行文字 とする。 read(FILE, $buf, 512) ってのもめんどくさそうだし、できれば while(<FILE>) で 済ましたいんですが、意味のある改行もあるしなぁ。。。
323 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 00:20:39 ] >>322 何をしたいのか知らんが、まずCPANでPDF関係のモジュールを サーチしたほうがいいね。 あなたがしたいことを既に実現しているモジュールがあるかもしれないし、 少なくとも、改行文字の扱い方については、ソースの中にお手本が あると思うし。
324 名前:303 [2007/04/22(日) 04:50:29 ] 303ですが またまた超初心者な質問です。 requier './jcode.pl'; sub jis { $msg = $_[0]; &jcode'convert(*msg, 'jis'); } ってコードがあったのですが &jcode の後ろについている ' の意味がわかりません。 もしかして &jcode::convert(*msg,'jis'); と同義ですか? エディターの色分けが気持ち悪くなるので直したいです。教えてエロい人 Orz
325 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 05:35:13 ] Perl4
326 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 05:37:45 ] >>324 エロい人よりマニュアルに頼ろうよ。 <q cite="www.kt.rim.or.jp/~kbk/perl5.005/perlmod.html"> 古いパッケージ区切り子はシングルクォートでしたが、 現在はダブルコロンを使うのが推奨されています。 </q> mikeneko.creator.club.ne.jp/~lab/kcode/jcode.html#h2-2
327 名前:324 mailto:sage [2007/04/22(日) 11:13:18 ] なるほど! ありがとうございました >< Jcodeの使い方も含めて勉強してきます ><ノ
328 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 14:43:25 ] CPAN でインストールする際に以下のようなメッセージが出て失敗します。 Undefined subroutine &Compress::Zlib::gzopen called at /usr/local/lib/perl5/5.8.8/CPAN.pm line 5721. 何をインストールしても大体このエラーが出て失敗します。 Zlib は、 /usr/local/lib/perl5/site_perl/5.8.8/Compress/Zlib.pm にあって、サブルーチン gzopen もありました。 また、@INC に /usr/local/lib/perl5/site_perl/5.8.8 は含まれていました。 どこに問題があるか分からないのですが、教えてもらえないでしょうか。 環境は、 OSX 10.4.9 で Perl 5.8.8 を /usr/local/bin にインストールしました。
329 名前:デフォルトの名無しさん [2007/04/22(日) 16:09:08 ] >>328 あえて /usr/bin/perl ではなく /usr/local/bin/perl を使いたいわけね? で、実際に使ってる(環境変数 PATH で優先的に参照される)のは /usr/bin/perl ではなく、 /usr/local/bin/perl ってことに間違いはない?
330 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 16:35:51 ] >>329 レスありがとうございます。 >あえて /usr/bin/perl ではなく /usr/local/bin/perl を使いたいわけね? はい。ソースコードからインストールしたらそこにインストールされたので、 /usr/local/bin/perl を使っています。 >で、実際に使ってる(環境変数 PATH で優先的に参照される)のは /usr/bin/perl ではなく、 >/usr/local/bin/perl ってことに間違いはない? 間違いないはずです。 which perl で確認しました。 CPAN.pm の該当箇所をみると、 $CPAN::META->has_inst("Compress::Zlib") で判定した後に、 Compress::Zlib::gzopen を呼び出していました。 そこで gopen がないとなる理由がよく分かりません。
331 名前: ◆TWARamEjuA mailto:sage [2007/04/22(日) 17:40:08 BE:2287837-2BP(6823)] >>330 > >で、実際に使ってる(環境変数 PATH で優先的に参照される)のは /usr/bin/perl ではなく、 > >/usr/local/bin/perl ってことに間違いはない? > 間違いないはずです。 > which perl で確認しました。 $env してみると判るけれども標準ではpathが通っていないと思うですです。 PATH=/bin:/sbin:/usr/bin:/usr/sbin @MacOSX 10.4.9 もっぺん確認してみよう♪ ♯tu-ka未だに5.8.6のままなんだよなぁ。。。(´・ω・`) $ perl -v This is perl, v5.8.6 built for darwin-thread-multi-2level (with 3 registered patches, see perl -V for more detail)
332 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 17:55:38 ] >>331 レスありがとうございます。 $env で確認してみましたが、先頭に/usr/local/binがありました。 PATH=/usr/local/bin:/bin:/sbin:/usr/bin:/usr/sbin こうなるように、以前./bash_profile に追加しました。 となると、原因は不明でしょうか? インストールの仕方が悪かったのかなあ。
333 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 20:53:01 ] CPANなんてまともに動作すると思うほうがおかしい。 手動で入れろ。
334 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 21:21:50 ] >>323 THX PDFファイルのすべてを把握するのが目的です。 CPANをみたところ、PDFのテキストや書誌情報を抽出したりするためのAPIは用意されてる のですが、もっと低レベルなパーサーがないようです。。 各種トークンが出現するたびにイベントを起動するような奴がほしいんですが。 HTML::ParserのPDF版でPDF::Parserみたいな感じの奴です。
335 名前:デフォルトの名無しさん [2007/04/22(日) 23:26:59 ] 日曜潰してまだ分からないので、どなたか助けてください\(ToT)/ UTF-8でURIエスケープされた文字列を、アンエスケープするPerlの処理でけつまづいてます。 元の文字列をURIエスケープした文字列がサーバ側まで来ているのは確認しました。 「質問」→「%E8%B3%AA%E5%95%8F」だとか、「ü」→「%C3%BC」だとか。 これを $utf8str =~ s/%([a-f\d]{2}/pack('H2',$1)/egi; しても、正しくアンエスケープされない(文字化けする)のです。 UTF-8が可変バイトなのが曲者なのでしょうか。。。 ググった先(ttp://oshiete1.goo.ne.jp/kotaeru.php3?q=1644542)の $utf8str =~ s/%(e[a-f\d])%([a-f\d]{2})%([a-f\d]{2}/pack('H2',$1).pack('H2',$2).pack('H2',$3)/egi; してもやはりだめでした。
336 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 23:56:33 ] >>333 むあじっすか。
337 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 23:59:22 ] >335 use Encode qw/from_to/; my $str = '%E8%B3%AA%E5%95%8F'; # utf8の'質問'をエスケープ (my $dec = $str) =~ s/%([a-f\d]{2})/pack 'H2', $1/egi; from_to($dec, 'utf8', 'cp932'); # Winのコマンドプロンプトで表示するのでcp932にしてる print $dec; とりあえずこれで動いてるけど? ブラウザに出してるんなら、Shift_JISって解釈されてるとかじゃない??
338 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 00:01:31 ] >>335 > $utf8str =~ s/%([a-f\d]{2}/pack('H2',$1)/egi; $1のための括弧が閉じられてません。 あとは、UTF-8に対応したEditorで開いてないとかでしょうか。 上の式で正しくアンエスケープされました。
339 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 00:35:06 ] 括弧閉じ忘れでごめんなさいorz >>337 さんのスクリプトを実行したところ、文字化けしませんでした。 また、from_toする前でも、ファイルにリダイレクトして、 そのファイルをエディタで開いても同様に文字化けしていませんでした。 しかし、サーバに持って行ってブラウザに結果を出すと文字化けしてしまいます。 エディタはUTF-8に対応していて、Perlスクリプトもutf-8で保存して、 use utf8; use open ":utf8"; use open ":std";して、 print "Content-type: text/html; charset=utf-8\n\n"; いるのですが、 >>337 さんのものでprint $dec;でもprint $str;でも駄目(文字化け)でした。 環境はWin XP SP2 + IE7、[表示]-[エンコード]でもUTF-8であることを確認しているのですが。。 。 度々で申し訳ないのですが、他に何か怪しい箇所がありますでしょうか?
340 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 00:49:03 ] #!/usr/bin/perl my $str = '%E8%B3%AA%E5%95%8F'; (my $dec = $str) =~ s/%([a-f\d]{2})/pack 'H2', $1/egi; print "Content-Type: text/plainl; charset=utf-8\n\n"; print $dec; __END__ とりあえず手元だとこれで動いてる。まずは問題の発生する最小限のコードまで切り詰めてみ?
341 名前:337 mailto:sage [2007/04/23(月) 01:17:20 ] ありがとうございました!解決しました。 use open ":std";が余計でした(よく分からないのに「おまじない」で書くのは駄目でしたね)。 問題のスクリプトから上記を除いて、かつ、 自分で作って読んでいるモジュールからも上記を除きました。 本当にありがとうございます!
342 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 01:18:56 ] 自分(↑)は>>337 さんでなくって>>335 でした。お目汚しでごめんなさい。 標準入出力を使わないなら、use open ":std";等は確かに不要でした。
343 名前:335 mailto:sage [2007/04/23(月) 03:15:36 ] 事後報告がてら・・・ use open ":std";を外せばアンエスケープで文字化けしないものの、 今度は後続処理でUTF-8な文字を処理できないという問題がありました。 結局、以下のサイトを参照して、 ttp://naoya.dyndns.org/~naoya/mt/archives/000611.html use open ":std";は残したままで、アンエスケープ処理の後に utf8::decode($str);でUTF8フラグを落とせば、 スクリプトへのUTF-8文字列の受け渡しも、後続処理も、うまく行きました。 夜更けにお答えくださって、本当にどうもありがとうございました。 これで安心して眠れそうです。
344 名前:デフォルトの名無しさん [2007/04/23(月) 18:08:16 ] ■ Perl言語 ■ 何でも質問コーナー ■ mixi.jp/view_bbs.pl?id=17607679&comm_id=1401396 Perlに関すること、cgiに関すること なんでも質問できるコーナーです(たとえばApacheとかでもOKとします!) (Web系であればOK) ルール: Google検索で調べてわかるようなことでも質問してもOKです (初心者のうちは、どの情報を取捨選択したらイイのかわからないと思うので) 回答してくださるかたは、暖かく質問者を迎えてやってください o(^^o) (o^^)o
345 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 18:19:57 ] そのトピック自体はどうでもいいんだが コミュニティのタイトルとか説明文が凄く気になって仕方が無い。
346 名前: ◆TWARamEjuA mailto:sage [2007/04/23(月) 19:56:34 BE:3485748-2BP(6823)] コミュニティの名前 PERL言語 CGI言語 コミュニティの説明 perl言語 cgi言語のコミュニティです だそうです。。。
347 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 04:11:19 ] Web系NGなこのスレとうまく連携していければいいですねo(^^)o
348 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 08:17:44 ] 未だにCGIが(ry
349 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 10:36:14 ] ダメそうなコミュだなw
350 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 22:51:58 ] どうしようもない質問の数々に、「ちったぁマニュアル読んでください!」と、 最後に管理者がキレるに1票。
351 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 02:27:30 ] いやあ管理人もろくすっぽ読んでないんじゃないか?
352 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 11:12:27 ] 実は、管理人自身が2ちゃんねるで質問したところ、 「ググれカス」だの「マニュアル嫁」みたいな回答しか 返ってこなかったので、管理人にやさしく教えてくれる ところが欲しかったんじゃないの?
353 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 12:06:40 ] >>352 もちろんそうでしょ。 そうじゃなきゃルール書きの冒頭が「Google検索で調べて わかるようなことでも」で始まるわけないっすよ。
354 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 12:33:51 ] モヒカン族はお断りです><
355 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 17:38:48 ] モヒカン族の土地に侵入してきたくせに、大きい顔をするな
356 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 19:00:43 ] 座り込んで動かない、口だけ達者なでっぷり太ったモヒカン族ほど 役に立たないものはない。 川に流してしまいたい。
357 名前: ◆TWARamEjuA mailto:sage [2007/04/25(水) 20:55:45 BE:980633-2BP(6824)] 不法投棄しちゃダメです♪
358 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 21:32:05 ] 食肉に加工するというのはどうだろう
359 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 22:08:09 ] 強くなれ!! と願いを込めて、子供たちに食べさせるとよいね。
360 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 23:13:46 ] 弱者の肉なんかいくら食べても強くなれないよ
361 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 23:27:06 ] 食べるのなら、戦場で最前線に立つモヒカンを食べよう。
362 名前:デフォルトの名無しさん mailto:sage [2007/04/26(木) 09:20:12 ] / : 》:、∩ (===○=)/ センセー __ / ⇔ / 話しについてけませーん \⊂ノ ̄ ̄ ̄\ ||ヽ|| ̄ ̄ ̄ ̄|| ...|| ̄ ̄ ̄ ̄||
363 名前:デフォルトの名無しさん mailto:sage [2007/04/26(木) 22:17:39 ] >>346 CGI言語と来たか・・・。 本当に作ってしまって混乱させるというのはどうか? もちろんその言語はクライアントマシンの限られた 中でしか使えず、 Web の CGI になんて使えないのだ。
364 名前:デフォルトの名無しさん mailto:sage [2007/04/26(木) 22:18:42 ] Common Graphics Interface とかいう紛らわしいグラフィック操作用言語を新たに作る。
365 名前:デフォルトの名無しさん mailto:sage [2007/04/26(木) 23:07:10 ] parrot上で走らせたらもっと混乱の元に。
366 名前:デフォルトの名無しさん mailto:sage [2007/04/26(木) 23:15:11 ] コモン グラフィックス インタープリター 池袋で乗車してきた女の子がハロプロエッグの子とかたかまりこ
367 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 11:39:27 ] ついでだ。IT言語というのも作ってしまえ。
368 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 11:57:03 ] そろそろここは質問箱だということを思いだそう。
369 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 15:28:36 ] そういえば Perl の質問がないなあ・・・。
370 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 15:34:31 ] Chanto Gugure Internet de
371 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 17:29:18 ] perlってグーグル八分されてるんだってね
372 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 18:13:20 ] WindowsでDOSコマンドの結果を取り込むには、 どうすればよろしいでしょうか?例えば、 dir c:\trash の結果を取り込もうとしても、次のスクリプトではうまくいきません。 $files = `dir c:\\trash`; print "The files are $files\n";
373 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 18:43:53 ] GW前に出された宿題で質問が増えるから大丈夫w
374 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 18:53:55 ] >372 手元だとそれでうまくいってるけど。
375 名前:372 mailto:sage [2007/04/27(金) 20:04:12 ] >>374 すみません。書き忘れていました。>>10 にある先頭の5行を入れていました。 use utf8; use open IO => ":encoding(cp932)"; binmode STDIN => ":encoding(cp932)"; binmode STDOUT => ":encoding(cp932)"; binmode STDERR => ":encoding(cp932)"; 「use open IO => ":encoding(cp932)"; 」の行を削除して 次のように修正すると動きました。 use Encode; $orgfiles = `dir c:\\trash`; $files = decode('cp932', $orgfiles); print "The files are $files\n";
376 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 21:23:44 ] >>372 例によって cmd.exe /c dir ... じゃない?
377 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 21:24:53 ] 失礼、関係なかったのね。
378 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 21:35:08 ] >371 記号が多いから、とか?
379 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 22:21:10 ] >>378 うんにゃ、LWPのUAがはじかれる件でしょ?
380 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 22:23:19 ] >>378 Perlで書かれたボットの多くがLWPのデフォルトUser-Agentをそのまま名乗って おり、403を食らうようになった。当然だがUAを変えれば通れる。
381 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 22:24:27 ] Google八分ってのは、Googleの検索結果に出なくなる話だから、 今回のそれとは違うよな。
382 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 22:30:29 ] 新しく覚えた言葉を使ってみたかっただけだろ そう責めるな
383 名前:デフォルトの名無しさん mailto:sage [2007/04/28(土) 00:19:39 ] perlのモジュールって一気にアップデートできないの? それとも使う奴だけ手動でアップデートさせるしか方法ない?
384 名前:デフォルトの名無しさん mailto:sage [2007/04/28(土) 00:39:19 ] >383 cpanシェルでupgrade
385 名前:378 mailto:sage [2007/04/28(土) 01:18:47 ] Perlに限らないけど、プログラミング言語の仕様として存在する演算子や記号は検索しづらいよなあ。
386 名前:デフォルトの名無しさん mailto:sage [2007/04/28(土) 03:22:17 ] 不満を抱えるものが改善する。それが基本である。
387 名前:デフォルトの名無しさん mailto:sage [2007/04/28(土) 05:09:49 ] でもそれを誰かが改善したらPythonっぽい何かになるからPythonでいいよねw
388 名前:デフォルトの名無しさん mailto:sage [2007/04/28(土) 17:56:47 ] 比較演算子は記号じゃなくて文字列にすりぁいいんだよな Pealのeqとかみたいにさ
389 名前:デフォルトの名無しさん mailto:sage [2007/04/28(土) 19:26:07 ] >>380 なったと言っても数年前からだよ。 今頃騒いでるやつらはアンテナが低すぎると思ったのだった。
390 名前:デフォルトの名無しさん mailto:sage [2007/04/29(日) 01:57:47 ] struct { char len1; char word1[len1]; char len2; char word2[len1]; char len3; char word3[len1]; } みたいな構造の可変長のバイナリなデータがあるんですが、 これをperlで綺麗でかっこよく展開する方法ってないですか? 今は下のようなことをしてるのですが、なんか見辛いし汚いので… $data = "\4ABCD\3EFG\7HIJKLMN"; ($len1,$data) = unpack("Ca*",$data); ($word1,$data) = unpack("a${len1}a*",$data); ($len2,$data) = unpack("Ca*",$data); ($word2,$data) = unpack("a${len2}a*",$data); ($len3,$data) = unpack("Ca*",$data); ($word3,$data) = unpack("a${len3}a*",$data); print "$word1\n$word2\n$word3\n";
391 名前:デフォルトの名無しさん mailto:sage [2007/04/29(日) 03:40:49 ] 少なくともループ構造にするべきだと思う
392 名前:デフォルトの名無しさん mailto:sage [2007/04/29(日) 04:06:37 ] >>390 perldoc -f pack して目を皿のようにして熟読せい。 The "/" template character allows packing and unpacking of strings where the packed structure contains a byte count followed by the string itself. You write *length-item*"/"*string-item*.
393 名前:デフォルトの名無しさん mailto:sage [2007/04/29(日) 05:12:56 ] >>392 あああああ、そんなテンプレートがあったんですね。 日本語の5.6ベースのman見てたので気づきませんでした… ありがとうございます。
394 名前:デフォルトの名無しさん mailto:sage [2007/04/30(月) 02:59:39 ] >>393 あ、すまん。 5.6からの拡張だと思ってたが、違ったか(393には問題ないみたいでよかった)。
395 名前:デフォルトの名無しさん [2007/05/01(火) 17:38:05 ] ファイル内の文字列を置換するスクリプトを書いているところなのですが、 「置換する」「置換しない」(飛ばす)「残り全て置換」「キャンセル」という 処理を行うにあたって、見つけた文字列を置換せずに飛ばして次を置換する 方法が思いつきません。置換しないテキストは適当な文字列に置換しておいて 最後に戻すという方法も考えたのですが、あまりスマートではないと思いまし た。何かよい方法があったら、お知恵をお貸しください。 while($text =~ /($regexp)/) { if($all == 0) { $before = $1; $after = $1; $after =~ s/$regexp/$replace/m; print "置換前:\n$before\n置換後:\n$after\n"; do { print "置換する? [y]es [n]o [a]残り全て [g]キャンセル "; $key = <STDIN>; chomp($key); } while ($key ne "y" and $key ne "n" and $key ne "a" and $key ne "g"); if($key eq "y"){ $text =~ s/$regexp/$replace/m; }elsif($key eq "n"){ # ここをどうする? }elsif($key eq "a"){ $text =~ s/$regexp/$replace/gm; $all = 1; }else{ exit; } }elsif($all == 1) { $text =~ s/$regexp/$replace/gm; } }
396 名前:395 [2007/05/01(火) 17:39:43 ] 補足です。$textはファイルの内容、$regexpは置換前の文字列、$replaceは 置換後の文字列です。
397 名前:デフォルトの名無しさん mailto:sage [2007/05/01(火) 17:51:02 ] >>395 ヒント: posと\G perl -e '$x = "aaaaaa"; pos($x) = 2; $x =~ s/\Ga/x/; print $x,"\n";' aaxaaa
398 名前:395 [2007/05/01(火) 21:09:08 ] ありがとうございます、無事できました。コードはこのようになりました。(たぶん問題ないはず…) $p = 0; while($text =~ /\G(?:.*\n)*?.*?($regexp)/gm) { $p = pos($text) - length($1); pos($text) = $p; if($all == 0) { $before = $1; $after = $1; $after =~ s/$regexp/$replace/m; print "置換前:\n$before\n置換後:\n$after\n"; do { print "置換する? [y]es [n]o [a]残り全て [g]キャンセル "; $key = <STDIN>; chomp($key); } while ($key ne "y" and $key ne "n" and $key ne "a" and $key ne "g"); if($key eq "y"){ $text =~ s/\G$regexp/$replace/m; pos($text) = $p + length($after); }elsif($key eq "n"){ pos($text) = $p + length($before); }elsif($key eq "a"){ $text =~ s/\G$regexp/$replace/gm; $all = 1; }else{ exit; } }elsif($all == 1) { $text =~ s/\G$regexp/$replace/gm; } }
399 名前:デフォルトの名無しさん mailto:sage [2007/05/01(火) 21:31:38 ] \Gの使い方がおかしいような 最後の全置換は絶対うまくいかんだろ
400 名前:デフォルトの名無しさん mailto:sage [2007/05/01(火) 22:01:18 ] せっかく書いたんだからたぶんとかいってないで動かしてみるべきだな。
401 名前:395 mailto:sage [2007/05/01(火) 22:02:38 ] すみません、やっぱ問題がありました。置換位置\Gが正規表現に含まれている と、置換される文字列に改行が含まれている際に、オプション"g"をつけても 複数置換してくれなくなってしまうのですが、どうすればいいんでしょうか。 perl -e '$text = "a\na\na"; $text =~ s/\Ga/b/gm; print "$text\n";' 結果: b a a perl -e '$text = "aaa"; $text =~ s/\Ga/b/gm; print "$text\n";' 結果: bbb perl -e '$text = "a\na\na"; $text =~ s/a/b/gm; print "$text\n";' 結果: b b b
402 名前:デフォルトの名無しさん mailto:sage [2007/05/01(火) 22:23:56 ] \Gは置換文では使わないほうがいいよ。代入されるとposがリセットされてしまうから あとを置換しながらposを保持することはできないのでコピーを作ることを考えてみては 自分ならこう書く my $replaced_text; pos $text = 0; while (pos $text < length $text) { if ($text =~ m/\G $regexp/gcsx) { # ここで入力による分岐処理を行う } elsif ($text =~ m/\G(.+?) (?=$regexp)/gcsx) { $replaced_text .= $1; } else { $text =~ m/\G (.*)/gcsx; $replaced_text .= $1; }