1 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 12:22:12 ] "The duct tape of the Internet" こと、Perlについての質問箱です。 "There's more than one way to do it" ということで、 Perlの奥深さについて皆で語り合い、追求してまいりましょう。 CGIについての質問は板違いです。WEBプログラミング板でどうぞ。 CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。 ( WEBプログラミング板 pc11.2ch.net/php/ ) CGIの質問は答えが Perlと全然関係ない話に帰着する場合が 多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。 このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。 スレ違いの質問にはスルーか、速やかな誘導をお願いします。 www.perl.org/get.html ● 2008/09/21 現在の最新版(安定版): 5.10.0 ● 2008/09/21 現在の開発版: 5.9.5 ▼ 前スレ Perlについての質問箱 37箱目 pc11.2ch.net/test/read.cgi/tech/1218449440/ リンク集は>>2-3 Perl 日本語処理の基礎の基礎 >>4 過去スレは>>5-6 あたり
461 名前:407 mailto:sage [2008/11/13(木) 16:33:58 ] >>408 レスありがとうございます。 規制に巻き込まれてしまい、返事が遅くなってしまいました やはり一度読み込み直すしかありませんか… 外部データが増えるとそれだけ読み込み・追加・書き出しに時間がかかってしまうので 何とか追加だけでやりくり出来ないかと考えていたのです。 アドバイスと合わせ、色々模索してみたいと思います
462 名前:460 mailto:sage [2008/11/13(木) 16:48:31 ] 誤 $c <= @qz 正 $c <= @{$_->{'選択肢'}} 余計なことするといつも恥をかく...orz
463 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 18:20:36 ] >>461 > やはり一度読み込み直すしかありませんか… いや。 普通、DBM類を使う。
464 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 19:39:19 ] >>461 全ての面倒を読み込み側に押し付けるって手もある。 保存用フォルダに "${^T}.${$}" 等のファイル名で書き出すとか。
465 名前:デフォルトの名無しさん [2008/11/13(木) 20:08:32 ] この度、WindowsサーバーのPerlを5.6.1から5.8.8にバージョンアップ する事になりました。 バーチャルサーバーを立ててWEBチームにテストしてもらっていたのですが、 動かない部分がいくつかある模様です。 WEBチームからPerlのバージョンアップによって 命令がどう変わったか等を調べて欲しいと頼まれたのですが、 どのようにして調べれば良いのでしょうか? ご教授お願いいたします。
466 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 20:21:12 ] >>465 perldoc.perl.org/index-history.html
467 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 20:47:19 ] 「質問を質問で返すな」って、そんな場面は、結構あると思うし、 そもそも(発端になった)>>435 は質問に、まったく答えてない訳でも 無いのに…。 「夕飯何にしようか?」 「肉が良いなぁ。焼肉としゃぶしゃぶどっちが良い?」 「質問を質問で返すなm9(^Д^)プギャー」 とか言っちゃうのかな?(w
468 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 20:51:27 ] いうだろ
469 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 21:00:57 ] これがゆとり大学生の実態である。
470 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 21:03:53 ] >>465 >命令がどう変わったか 「命令」は変わってないよな。w マジレスすると、変更内容を調べるよりも、 ダメなところを特定して調整するほうがきっとマシ。 それがイヤなら、Perlのバージョンを戻せ。 つか、両方インストールして使いわけろよ。ふぁ。
471 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 21:12:38 ] >>461 キーの重複はかまわないのか? ☆かまわない 別のファイルに出力してから、もとのファイルに くっつければいいんじゃね。 ☆ダメ 前のファイルを読み込まずに、重複を調べる 方法を教えろ。 続きはそれからだ。
472 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 21:51:49 ] × 続きはそれからだ。 ○ 続きはよそでやれ。
473 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 21:56:22 ] 「夕飯何にしようか?」 「普通に焼肉じゃいけないの?」
474 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 21:56:52 ] 「夕飯何にしようか?」 「普通にしゃぶしゃぶじゃいけないの?」
475 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 21:57:56 ] 「夕飯何にしようか?」 「普通にカレーじゃいけないの?」
476 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 21:59:48 ] 「夕飯何にしようか?」 「ラーメンじゃダメなの?」
477 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 22:32:54 ] 「夕飯何にしようか?」 「俺が決めていいの?」
478 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 01:30:11 ] 夫「今日の夕飯なに?」 妻「何が食べたいの?」 夫「質問に質問で返すなっ!!」 ……これが>>430 の結婚生活(もしあったとして)
479 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 05:35:27 ] 「夕飯何にしようか?」 「晩飯じゃないの?」
480 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 06:10:57 ] 単一ファイル内で複数packageを定義した場合、 継承がうまく動かないのですが、どうすれば良いでしょうか。 $foo = Foo->new(); # OK $bar = Bar->new(); # NG package Foo; sub new { bless {}; } package Bar; @ISA = qw(Foo); これだと Bar->new() が失敗します。 package Bar 部分を Bar.pm というファイルにして、ファイル先頭で use Bar すると 問題ないのですが、単一ファイル内で継承させる場合はどう書けば良いのでしょうか。
481 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 06:42:23 ] {package Foo; sub new { bless {}; } } {package Bar; @ISA = qw(Foo);} $foo = Foo->new(); # OK $bar = Bar->new(); # OK
482 名前:480 mailto:sage [2008/11/14(金) 07:00:38 ] >>481 おおお。助かりました。thanks!
483 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 08:40:19 ] package Foo; sub new { bless {}; } package Bar; @ISA = qw(Foo); package main; $foo = Foo->new(); # OK $bar = Bar->new(); # OK じゃねえの
484 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 14:24:45 ] 夫「今日の夕飯なに?」 妻「スキヤキじゃダメなの?」 夫「・・・」
485 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 14:26:27 ] 夫「赤ちゃん産まれた?男の子?女の子?」 妻「男じゃダメなの?」 夫「・・・」
486 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 19:10:29 ] >>485 その流れはヤバい!w もう離婚するしかないな。
487 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 20:42:25 ] ゴメン理解できない 童貞の俺にも分かるように詳しく
488 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 20:53:25 ] 童貞じゃないけど、俺もわからん!
489 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 21:03:13 ] 女だったら、夫がロリコンでいたずらすると思ったんだろう。
490 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 21:50:28 ] な〜る
491 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 21:58:27 ] 深読みしすぎてた トン
492 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 22:46:06 ] >>489 それは俺も考えたけど、 それだとスキヤキが説明できない。
493 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 05:16:10 ] >>485 もう嫁ケンカうってるじゃんw
494 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 09:03:03 ] ツンなだけだろw
495 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 10:19:13 ] 生まれる段階に至っても性別を知らなかった夫
496 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 19:02:17 ] 産まれた?って訊いてる時点でダメだろ
497 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 19:58:51 ] 後のオブジェクト指向である
498 名前:デフォルトの名無しさん [2008/11/16(日) 02:32:11 ] 同じ文字列を使ってもDigest::MD5で得られる16進とmd5sumの結果が違うのはなぜでしょうか
499 名前:498 mailto:sage [2008/11/16(日) 02:36:14 ] 自己解決しました。 一方には改行コードが含まれていないだけでした。
500 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 10:31:38 ] perlのマッチ演算子で変数が使えますけど $pat = "foo"; $str =~ /$pat/; # この場合 /foo/ と同じ 変数に含まれる文字を全て普通の文字としてマッチさせるにはどうしたらいいでしょうか。 たとえば $pat = "foo[0]"; だと、/$pat/では[0]の部分を文字クラスとして処理するよう ですが、単純に "foo[0]" という文字にマッチしてほしいのです。
501 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 10:36:15 ] /\Q$unko\E/
502 名前:デフォルトの名無しさん [2008/11/16(日) 13:14:45 ] dmain.cpp Note: including file: d:/projects/game/include\common.h Note: including file: d:/projects/game/include\product.h Note: including file: d:/projects/etc/psdk/include\WindowsX.h Note: including file: d:/projects/etc/psdk/include\windows.h こういうファイルを dmain.obj: \ /cygdrive/d/projects/game/include/common.h \ /cygdrive/d/projects/game/include/product.h \ /cygdrive/d/projects/etc/psdk/include/WindowsX.h \ /cygdrive/d/projects/etc/psdk/include/windows.h \ dmain.cpp こんな風にするスクリプトってどうやるの?
503 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:57:44 ] perl -ple 's/$/\\/; s/cpp/obj/; s/Note: including file: d:/\/cygdrive\/d/; END{ print "dmain.cpp";} '
504 名前:デフォルトの名無しさん [2008/11/17(月) 20:02:29 ] 質問です。掲示板のプログラムなのですが、データファイル(1行1投稿内容のテキストファイル) を掲示板のCGIのサーバーとは異なるサーバーに置きたいのですが、その場合どのように すればよいでしょうか? できればmySQLサーバーはインジェクションの関係で使いたくあり ません。 サーバー1 掲示板cgiや画像データなどを担当 サーバー2 掲示板テキストデータ(掲示板cgiから読み書きされる) なにかアドバイスをお願いします。
505 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 20:11:26 ] >>504 NFSマウント。とネタレス。 WebProg行け。とマジレス。 その質問だとperl無関係だから、いきなりperlのスレに行くなよ…。
506 名前:デフォルトの名無しさん [2008/11/18(火) 19:27:48 ] www.drk7.jp/MT/archives/001422.html に記載されている通りにやったのですが、 C:\strawberry\cpan\build\DB_File-1.817-XRfyBQ>perl Makefile.pl Parsing config.in... Looks Good. Note (probably harmless): No library found for -llibdb Writing Makefile for DB_File C:\strawberry\cpan\build\DB_File-1.817-XRfyBQ>dmake cp DB_File.pm blib\lib\DB_File.pm AutoSplitting blib\lib\DB_File.pm (blib\lib\auto\DB_File) gcc -c -I/usr/local/BerkeleyDB/include -s -O2 -DWIN32 -DHAVE_DES_FCRYPT -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -fno-strict-aliasing -DPERL_MSVCRT_ READFIX -s -O2 -DVERSION=\"1.817\" -DXS_VERSION=\"1.817\" "-IC:\strawberry \perl\lib\CORE" -D_NOT_CORE -DmDB_Prefix_t=size_t -DmDB_Hash_t=u_int32_t versi on.c version.c:30:16: db.h: No such file or directory dmake: Error code 129, while making 'version.o' と出てしまい、DB_Fileが結局インストールされません。 INCLUDEもLIBも自分の環境に沿って変えているのですが出来ません。 どなたかよろしくお願いします。
507 名前:デフォルトの名無しさん [2008/11/18(火) 20:14:56 ] 長文すみません 以下のjavaを // 平均パケット到着レートの算出&ヒストグラム構成 if (preTimeList.size() >= pktNumForCalcRateAverage) { sampleAveRate = pktNumForCalcRateAverage / (nowTime - preTimeList.remove(0)); int point = (int)(sampleAveRate / gap); histgram[point] += 1; total += sampleAveRate; lineNum += 1; } をperlに書き変えたいのですが # 平均パケット到着レートの算出&ヒストグラム構成 if ($preTimeList.size() >= $pktNumForCalcRateAverage) { $sampleAveRate = $pktNumForCalcRateAverage / ($nowTime - $preTimeList.remove(0)); $point = ($sampleAveRate / $gap); $histgram[$point] += 1; $total += $sampleAveRate; $lineNum += 1; } ではエラーが出てしまいうまくいきません。 nowTimeが間違っているのでしょうか? どなたかアドバイスお願いします。
508 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 21:14:27 ] エラーメッセージは?
509 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 21:56:41 ] それ以前の問題だろ… javaの文章に適当に$つけりゃperlになるとでも思ってんのかねえ?
510 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 21:58:07 ] Perl 6で動かしてるとか
511 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 22:36:19 ] エラーメッセージを読む。 そういうクセをつけてあげないと、本人のために良くないだろ。
512 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 22:57:13 ] すげえ正論っぽいし、事実>>507 に対するレスじゃなきゃ 完全同意なんだけどねえ。 車を運転しようとしてる9歳児に「交通規則は守れるか?」 って問うくらいには見当違いだと思う。
513 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 23:17:55 ] まあまあ、推測に推測を重ねていないで、ここは本人のレスポンスを 待とうじゃないか。
514 名前:デフォルトの名無しさん [2008/11/19(水) 00:13:09 ] >>505 ありがとうございます。別にきいてみようとおもいます。
515 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 00:44:16 ] >>507 - java の . と perl の . の違い - int の意味 - java の size メソッドと perl の scalar @arr で何が得られるか - java の remove メソッドと perl の shift ( or splice ) - 更には各変数と配列に何が入っててどういう状態なのか - 前後にどういう処理が行なわれているか これが直に答えられないなら移植なんか考えない方が良いよ。
516 名前:506 [2008/11/19(水) 03:43:41 ] No library found for -llibdb じゃなくて No library found for -ldb でした…。 どなたかよろしくお願いします…。
517 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 07:47:34 ] >>516 dbは正常にインストールされているのか
518 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 19:35:21 ] >>512 じゃあ何と言うべきなの? キミにはまだ早い、オトナになるまで待ちなさい、とでも?
519 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 19:45:50 ] ゆとり乙 でおk
520 名前:506 [2008/11/20(木) 00:21:04 ] >>517 さん dbというとちょっと分からないのですが、 Berkeley DB 4.6.21 をインストールして、 www.drk7.jp/MT/archives/001422.html に書いてある通りに全ての手順を踏んだのですが、 No library found for -ldb となって出来ないんです…。
521 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 04:46:40 ] ぜんぜん詳しくないけど、あてずっぽうで・・・ gcc -c -I/usr/local/BerkeleyDB/include -s -O2 -DWIN32 -DHAVE_DES_FCRYPT -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -fno-strict-aliasing -DPERL_MSVCRT_ READFIX -s -O2 -DVERSION=\"1.817\" -DXS_VERSION=\"1.817\" "-IC:\strawberry \perl\lib\CORE" -D_NOT_CORE -DmDB_Prefix_t=size_t -DmDB_Hash_t=u_int32_t versi on.c -L オプションが見当たらないけど、なんで? -IC:\strawberry\perl\lib\CORE" って正しいのかな?lib のディレクトリを -I で指定してるけど。 lib ディレクトリにヘッダファイルが入ってるの?? -ldb が無い、って言ってるんだから、ほんとうに無いのか、あるのか、自分の目で確かめたかな? -ldb と省略せずに、\hoge\hage\libdb.l みたいにフルパスで指定してみてはどうか?
522 名前:デフォルトの名無しさん [2008/11/20(木) 20:16:22 ] require 'ファイル名'; とするときに、1つ前のディレクトリにあるファイルを指定したいのですが、どうすればいいでしょうか? require '../ファイル名'; だとエラーがでてしまい、できません。
523 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:40:27 ] >>522 1つ前の前に現在地がどこかを考えるんだ ../ や ~/ はシェルの機能なんだ
524 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 02:09:21 ] >>522 スクリプト保存場所と実行場所が同じならそれで動く。 (多分このケースだろうけど)違って場所固定ならスクリプトに use FindBin; require "$FindBin::Bin/../hoge.pl" ; 但し、FindBin はケースによってスクリプト保存場所を 示さない場合があるので、そんな場合には FindBin::Real だか CPAN から引っ張って来て使う。 (蛇足)スクリプト内でカレントディレクトリに動的変化があり、 require する対象も連動変化があるなら、 use Cwd ; しといて require getcwd . q{/../hoge.pl}しなきゃならん。
525 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 02:16:40 ] あ。説明一行目正確じゃねえな。 「保存場所に関係無く、実行場所の ../ にあるならそれで動く。」 に訂正。
526 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 03:33:20 ] まぁたいてい、マウスでクリックして動作させるだろうから カレントディレクトリをスクリプトのあるディレクトリに移動させておく、とか そういう処理が必要だろうな。
527 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 06:37:05 ] >>522 エラーメッセージは?
528 名前:506 [2008/11/21(金) 13:19:05 ] >>521 さん 返信ありがとうございます。 libdb.a というのは前述したURLに書いてある通りに作成しました。 -Lオプションに関してはわかりません…。 確認したところ \strawberry\perl\lib\CORE にヘッダファイルがたくさん入ってました。 -ldbに関しては検索しているのですが、どうしてもわからないんですよね。 やはりWindowsでperl環境は無茶があるのでしょうか。
529 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 17:18:30 ] >>528 なんか>>506 のエラーは エラー情報(version.cないよ、コンパイルエラーみたいな)っていうのは、 そのページの「CPAN で DB_File をインストール → 必ず失敗する。」のところだから そのまま次の「config.in を修正して DB_File を手動で dmake してインストール」 にいけばいいんじゃないの? そこでLIBパス設定してるし
530 名前:506 [2008/11/22(土) 01:11:58 ] >>529 さん 返信ありがとうございます。 修正して、dmakeしたところ C:C:\strawberry\cpan\build\DB_File-1.817-aAwZC0>dmake dlltool --def DB_File.def --output-exp dll.exp g++ -o blib\arch\auto\DB_File\DB_File.dll -Wl,--base-file -Wl,dll.base -mdll -s -L"C:\strawberry\perl\lib\CORE" -L"C:\strawberry\c\lib" version.o DB_File.o -Wl, --image-base,0x2d2e0000 C:\strawberry\perl\lib\CORE\libperl510.a \strawberry\c\ lib\libmsvcrt.a \strawberry\c\lib\libmoldname.a \strawberry\c\lib\libkernel32.a \strawberry\c\lib\libuser32.a \strawberry\c\lib\libgdi32.a \strawberry\c\lib\lib winspool.a \strawberry\c\lib\libcomdlg32.a \strawberry\c\lib\libadvapi32.a \stra wberry\c\lib\libshell32.a \strawberry\c\lib\libole32.a \strawberry\c\lib\libolea ut32.a \strawberry\c\lib\libnetapi32.a \strawberry\c\lib\libuuid.a \strawberry\c \lib\libws2_32.a \strawberry\c\lib\libmpr.a \strawberry\c\lib\libwinmm.a \strawb erry\c\lib\libversion.a \strawberry\c\lib\libodbc32.a \strawberry\c\lib\libodbcc p32.a dll.exp version.o:version.c:(.text+0x7a): undefined reference to `db_version' DB_File.o:DB_File.c:(.text+0x10d5): undefined reference to `db_create' collect2: ld returned 1 exit status dmake: Error code 129, while making 'blib\arch\auto\DB_File\DB_File.dll' となりました…。 blib\arch\auto\DB_File\ には.existsファイルしかありませんでした。
531 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:00:21 ] >>530 libdb.a はちゃんと C:\strawberry\c\lib\ にあるのかい?ってのと ↑には libdb.a という文字が登場しないなってのがあやしいかと。
532 名前:デフォルトの名無しさん [2008/11/22(土) 22:41:13 ] さくらインターネットの環境のせいかどうかわからないのですが、LWP::UserAgent mirrprの挙動がおかしいってことはありますか? mirror呼ぶと$tmpfile作るみたいなのだけど、そのstatのrdeb, size, blocksが0になって以下のエラーがでます。 Transfer truncated: only 0 out of 9446 bytes received 何かわかれば教えてもらえますか? LWP::UserAgent 5.819 FreeBSD 6.1-RELEASE-p23 This is perl, v5.8.8 built for i386-freebsd-64int
533 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 23:43:51 ] x64のppmリポジトリってまだないのね。 リポジトリ追加してもパッケージ数が0で何かと思ったらそういうことか…。
534 名前:506 [2008/11/23(日) 01:56:00 ] >>531 さん 解決しました! 531さんに指摘されて、libdb.aという文字が出ないのかを考えたところ、 ファイル名だけ変えていて、拡張子が変わっていませんでした。 要はlibdb.a.libというファイルでした。 なので拡張子変換ソフトを使ったところ上手くいきました! 本当ありがとうございます!
535 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 01:41:41 ] ちょっと前に、WWW::Mechanizeを1.34から1.50にupしたんですが、この1.50の挙動についての質問です。 1.50になってから、$mech->get('example.com/ ')なんかでgetsしてきたページの内容を $mech->content()で書き出すと、utf8フラグ付の文字列に自動でdecodeされたものが出力されます。 ($mech->response->contentでは、そのまま変換なしで返ってきます。) さらにこの状態で、$mech->find_linksやfind_images,$mech->form->inputsなどの戻り値オブジェクトから $_->textや$_->valueなども、utf8_decodeされたものが返ってくるようになりました。 これはこれで、戻り値を正規表現等で検知するのに便利になった部分もあるのですが、 今少しばかり困ったことになっております。 実は、とあるサイトをクロールしていて、そのページ自体はsjisで書いてあるのですが、 ページのheaderに、<meta http-equiv="content-type" content="EUC-JP">とかの記述があって、 どうもこの記述を鵜呑みにして、元の文字列をEUC-JPとしてdecodeをしてしまって、化けバケになりました。
536 名前:535 mailto:sage [2008/11/24(月) 01:42:13 ] そこで、$mech->get()した時に、自動でutf8デコードさせないようなオプションやメソッドを 探したんですが、それが見当たりません。 ドキュメントやソースファイルを読んでみて、Mechanize.pm内部で、$content = $res->decoded_content() が呼ばれているようで、それではとHTTP::MessageやHTTP::Headerにある、Encodingヘッダーやcontent_encoding あたりで制御するのかなと色々やって見ましたが、やっぱりutf8デコードされてしまいます。 (と言うか、イマイチこれらの使い方が合ってるのかよくわかりません。) どなたかこれらの制御方法をご存知の方はおりませんか? 現在のところ、WWW::Mechanizeを1.34以下に戻すか、実行スクリプトの中で *HTTP::Message::decoded_content = sub { shift->content }; と書く、などで回避しておりますが、もっとスマートな方法がないのかなと思っております。
537 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 17:23:57 ] Perl 5.8.6なんですが sysopen(TPL, $file, O_RDONLY) のとこで Argument "O_RDONLY" isn't numeric in sysopen というerrorを毎回吐きます。 動作は見たところ正常ですが、Apacheのerror_logにたまるのが気持ち悪くて…。 どこのサンプルにもマニュアルにも上の通りにかいてありますが、 O_RDONLYじゃいかんのですか?
538 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 17:33:00 ] O_RDONLY が定義されてないからじゃないの? >どこのサンプルにもマニュアルにも上の通りにかいてありますが、 いったい、どこのサンプルやマニュアルを見たんだい? おぢさんがひとつ、いいことを教えよう。 google 「perl O_RDONLY」 パソコンを買ったら、まず最初に google を覚えよう。
539 名前:537 mailto:sage [2008/11/24(月) 19:46:17 ] レスありがたふ そのキーワードで何度もぐぐったんですが ttp://perldoc.jp/docs/modules/CGI-Session-3.11/Tutorial.pod ttp://perldoc.jp/docs/perl/5.8.4/perlfunc.pod こんなんや、他の個人ブログやチュートリアルサイトでも sysopen(HANDLE, path, O_RDONLY); の例が出てくるんですよね
540 名前:537 mailto:sage [2008/11/24(月) 19:49:25 ] 自己解決しました 改めてよく読んだらperldoc.jpに「標準モジュール Fcntl 経由で」って書いてありましたね use Fcntlで解決しました >>537 ありがとうございました
541 名前:デフォルトの名無しさん [2008/11/24(月) 21:43:42 ] 3×3のクロスワードを作ろうと思います。 3文字の辞書ファイルは既にあって 3×3の真ん中には「か」という文字列が入っています。 このとき、3×3のクロスワードを作成するにはどうすればよいでしょうか。
542 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 21:55:33 ] ここって宿題の依頼もありだっけ?
543 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 21:57:31 ] Perlにカスってもいねえし
544 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 22:06:30 ] ゆとりは宿題はやってもらうものと考えてるからな。
545 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 23:26:48 ] 学業も仕事も他人に任せてゆとりの時間を楽しむのがゆとりの正しい姿 宿題をやる仕事を貧しい人達から奪うほど情が無いわけではありません
546 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 00:33:23 ] やってくれって言ってないじゃん!
547 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 01:34:49 ] メール鯖からパイプで渡された標準入力を 上手い事いじらせてくれるモジュールってあったっけ? Net::POP3〜MIME::Parserなら分かるんだが 標準入力しか触れないの扱わんとならんorz テキストをチマチマと拾ってくしかないのか・・・?
548 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 02:15:47 ] 日本語でおk
549 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 05:36:06 ] >>535 WWW::Mechanizeはよく知らないんだけど $res->decoded_content(charset => 'none'); この辺りヒントになるかも
550 名前:532 [2008/11/25(火) 13:39:13 ] mirrorじゃなくてそもそもrequest($url, $file)で$fileに取得できてないってことに気づいた。 おかげでCPANコマンドでも Transfer truncated: only 0 out of 149396 bytes received が出て死んでしまう。 ググっても他に同じような人出てこないし何いじってこうなったんだろう。。
551 名前:535 mailto:sage [2008/11/25(火) 13:39:41 ] >>549 レスありがとうございます。 確かに、LWP::UserAgentからは、$res->decoded_content(charset=>'none')で decodeされないcontentsが返って来るのを確認しました。 しかしながら、Mechanize.pm内では、このdecoded_contentに引数を渡す方法がなく、 またソース内のコメントに、 "Do we need to expose the options there?" みたいなことが書いてありますので、現状では必ずdecoded_content()が呼ばれてしまうみたいです。 そのため、リクエストのレスポンスヘッダやページ内の<meta>タグに、charset指定がある場合は、 それに従った Encode::decode($charset,$html) が返って来ます。 (このdecodeがコケた場合は、変換なしの元々のbyte文字列が返ってきます) code.google.com/p/www-mechanize/issues/list に要望でも出したら対応してくるのかな。
552 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 14:22:15 ] ヘッダの情報に合わせて自分で変換してしまう
553 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 17:05:16 ] >>551 ああ、なるほど。 deflate対応と文字コード変換がセットになってるのがややこしいんですよね。 decoded_content自体に罪は無いけど世の中のページはstrictじゃないページも沢山あるので デフォルトオフか最低でも設定でオフに(WWW::Mechanizeから)出来るように考慮されてるべきだと思います。 >"Do we need to expose the options there?" もちろん! というか主要な部分の挙動変えるなよって感じですが。 こういうPHP的なハマり方は耐えられません。
554 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 02:04:29 ] >>535 WWW::Mechanizeなんてサブクラス化して使うのが当たり前だから サブクラスで好きなように自分好みのcontentメソッド再実装したらいいよ 最近Perl使ってないので的外れなこといってるかもしれないけど 少し前まではMechanizeはそういう使い方が当たり前だった 生のWWW::Mechanizeを使うという考えを発想転換したら?
555 名前:535 mailto:sage [2008/11/27(木) 18:19:54 ] >>552 その発想は..(ry でも確かに、元ページのcharsetが既知ならば、それもありかもです。 >>553 そうなんです。decompress絡みとcharset変換が同じメソッド内で 同時に処理されてるのがなんだかなあと言う気もします。 まあ同意も得られたことですので、>>551 のレポートフォームに 要望でも出そうかと思ってるんですが、ascii文字主体の言語圏の人々に いかにしてこの思いを伝えようかと苦慮しているところです。 (その前に、英語も全然得意でないので、結構ビビッているんですが)
556 名前:535 mailto:sage [2008/11/27(木) 18:22:05 ] >>554 >WWW::Mechanizeなんてサブクラス化して使うのが当たり前だから うーん、そんなもんなのですか? 自分はあんまり継承とかサブクラス化を使わないので、こちらこそ的外れな 意見かもしれませんが、私の個人的な認識(印象?)では、クラスを継承したり サブクラス化するってことは、そのベースクラスの機能を最大限利用しつつ、 それプラス自分なりのメンバ(?)やメソッドを追加したり加工したり するために使うものかと思うのです。 (もしくは、イベント駆動型のmoduleにハンドラを追加する時など) ひょっとして>>536 ,551での書き方か悪かったのかもしれませんが、 今私が不便だと感じているのは、$mech->contentの動作自体ではなく、 $mech->get()した時点で、そこから連鎖的に内部のメソッドが実行され、 linkやformなどの$mech絡みのオブジェクトが、自動でutf8フラグ付に decodeされてしまったものがセットされる、とういうもです。 で、これを抑制したい、回避できないか、と。
557 名前:535 mailto:sage [2008/11/27(木) 18:22:37 ] つづきです。 確かに仰るとおり、気に入らない動作や挙動の関数なら、自前の関数でも 書いて上書きでもしてしまえっ、という考えは自分にもありますので、 どれを上書きすべきかと探索し、decoded_content()に行き着きました。 そこで>>536 の一行を追加し、とりあえずその場しのぎをしたんですが、 他の制御方法(mechの外からメソッドや、オプションを渡すなどで) をご存知の方がおられないかと思い、書き込みさせて頂きました。 ちなみに今回の例を、クラスメソッドを再定義して対処するとなると、 _update_page()と言う事になりますが、このメソッド全体をコピペして、 対象の一行だけ削除なりコメントアウトなりすれば目的は達成できますが、 ベースとなるクラスメソッドを再利用しないで一から再定義するような やり方が、mech使いの方には一般的なのでしょうか。 (自分的には、この_update_pageに伴って生成されるlinkやformオブジェクト は大変重宝しており、出来ればそのまま利用したいです。ですが今回の場合、 元の動作の一部をスキップするのが目的のため、$self->SUPER::(base_method) が利用できないので、あまり継承する意味が無いような気がするのですが) 長文、連投になってしまい、どうもすいません。
558 名前:デフォルトの名無しさん [2008/11/27(木) 19:13:28 ] 今入ってるレンタルサーバでmod_perlが使えると知り、 バージョンを調べたら1.9916となっていました。 この番号はどう読めばいいんでしょうか。 バージョン1にパッチ9916があてられている・・・のかな? 自宅の制作環境(Win)にも近いバージョンのものを入れたいのですが そのものズバリは見つかってなくて、どう選んだものか迷っています。 アドバイスよろしくお願いします。
559 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 01:21:41 ] >>556 失礼 content()はアクセサーだからget()で内部メソッドを辿る必要があったわ で、問題はもう自分でも解決してるみたいだけど、 _update_page()内のdecoded_content()の呼び出し ここの引数リストが空なので、メンバ変数なりクラス変数なりで渡すように サブクラスで再定義するといい >ベースとなるクラスメソッドを再利用しないで一から再定義するような >やり方が、mech使いの方には一般的なのでしょうか。 別にサブクラスじゃなくてもいいけど、サブクラスに定義した方が再利用性が高い コンパイル時に確定するので、順番とか気にしなくていい などのメリットがあると思われる ていうかオブジェクトクラスはサブクラス化することに意義があるし、そのように使われる ことを意識して書かれてることが多い 例えば、サブクラスで実装されることを意識して空のサブルーチンを置いたりする
560 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 23:28:35 ] 画像編集だとImageMagickあたりが定番かなと思いますが、 動画だったらffmpegあたりでしょうか?
561 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 06:54:09 ] 質問です。PerlでリモートのIISにWEBDAVの基本認証で接続し、 ファイルをアップロードしたいのですがうまくいきません。 #!/usr/bin/perl use HTTP::DAV; $d = new HTTP::DAV; $url = "192.168.0.100/dav/ "; $d->DebugLevel(3); $d->credentials( -user=>"user_name",-pass =>"pass", -url =>$url); $d->open( -url=>"$url") or die("Couldn't open $url: " .$d->message . "\n"); #処理 というソースなのですがオープンで失敗します。 >Couldn't open 192.168.0.100/dav/: Unauthorized. 長いので一旦切ります。