トップページ⇒php
1001コメント293KB

Perl コーディング初心者質問コーナー Part26

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/07/24 19:48ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

関連スレ
【Perl上級者コーナーPart01】
http://pc2.2ch.net/test/read.cgi/php/1024741312/
CGI: Common Gateway Interface part 11
http://pc2.2ch.net/test/read.cgi/php/1055597189/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/

過去ログやお勧めサイトは >>2-10
041241003/08/02 20:53ID:lcThEZov
>>411
レスありがとうございます。
早速、 print "content-type: text/html\n\n";を print "content-type: text/plain\n\n";
に直して再度うpしてみたのですが、結果は同じでした(´・ω・`)ショボーン

誠にあつかましいのですが、他に良い方法は無いでしょうか?
どうかよろしくお願いします。
0413nobodyさん03/08/02 20:55ID:???
トクトクは勝手にヘッダ情報変えなかったっけ?
0414nobodyさん03/08/02 21:03ID:???
>>410
HTMLで出力。
0415nobodyさん03/08/02 21:04ID:84QkeiYe
<a href="http://i.2ch.net/">2ちゃんねる(巨大掲示板)</a>の<a href="http://book.2ch.net/poem/i/">詩・ポエム板</a>
を、
2ちゃんねる(巨大掲示板)の詩・ポエム板
としたい(ようは、リンクを取り除きたい)のですが、
どうすればいいのでしょうか・・・?

わからないながらに、やってみましたが、
$HTMLContents =~ s/<a href="http:\/\/(.*)">(.*)<\/a>/$2/g;
とすると、「詩・ポエム板」しか$2に入りません。。。
0416nobodyさん03/08/02 21:06ID:???
>415
最小マッチングでぐぐれ。
041741503/08/02 21:21ID:84QkeiYe
>>416
さんくすです。
ぐぐりました。

$HTMLContents =~ s/<a href="http:\/\/(.*?)">(.*?)<\/a>/$2/g;

で解決しますた。
0418nobodyさん03/08/02 21:40ID:lx3eHYOp
CGIとは関係ないんだけど
@INCをコマンドラインで指定して実行する方法ってありましたっけ?
0419nobodyさん03/08/02 21:42ID:???
すみません。
-Iオプションですね。。。
0420nobodyさん03/08/02 21:43ID:???
>>418
何故ヘルプを見ない?
-Idirectory specify @INC/#include directory (several -I's allowed)
0421nobodyさん03/08/02 21:43ID:???
>>418=>>419
おっと失礼。>>420は無視しといて。
0422nobodyさん03/08/02 21:45ID:???
>>418
どうでもいいが、ここはCGIスレじゃないので一行目は余計。
0423nobodyさん03/08/02 23:01ID:???
>>412
print "**************************************************<BR>\n";
print "***   Hello! Welcome to the 2ch World!   ***<BR>\n";
print "**************************************************<BR>\n";
0424nobodyさん03/08/03 01:14ID:???
\nはプロンプトでの改行
htmlの場合はソース内の改行
当然見た目を改行させるには<br>がいる
042541203/08/03 09:51ID:???
>>411
>>413
>>414
>>423
>>424
できました! こんなくだらない質問に答えてくれて皆さんどうもありがとう
ございました<(_ _)>
0426nobodyさん03/08/03 12:05ID:???
>>425
くだらないつーか。text/plainを勝手にtext/htmlと解釈することがあるという
IEの仕様にからむ、とても難儀な問題なのだよ。
0427nobodyさん03/08/03 12:21ID:???
text/plainにかぎらず、例えばimage/jpegでも中身がHTMLらしければ。
0428nobodyさん03/08/03 13:14ID:???
あるブラウザは Content-Type: を無視して送られてきたコンテントの
内容を走査して、勝手に振る舞ってるってことかな
0429nobodyさん03/08/03 13:26ID:???
>>428
そういう糞ブラウザは、image/png でハードディスクの内容を消去するバイナリが埋め込まれていると、
実行しちゃうんだろうなぁ。。。
0430nobodyさん03/08/03 15:35ID:???

&foo( %ENV, "sample", 123456 );

sub foo
{
my (%a, $b, $c ) = @_;
}

こうやっても、%a $b $c に何も入ってこないよ〜
解らないよ〜ヽ(´Д`;)ノ
0431nobodyさん03/08/03 15:49ID:???
return
0432nobodyさん03/08/03 15:59ID:???
リファレンス
0433nobodyさん03/08/03 17:33ID:???
初心者スレなんだからそんな答え方じゃ解らんだろう

&foo( \%ENV, "sample", 123456 );

sub foo
{
my ($a, $b, $c ) = @_;
my %a = %$a;
}

リファレンスについては http://www.kt.rim.or.jp/~kbk/perl5.005/perlref.html
0434nobodyさん03/08/03 17:42ID:???
>>433
先越された(´・ω・`)

んじゃ一応補足……$a->{HOGE} とやればハッシュをコピーしなくてもそのまま参照可能。
配列の場合も同じように。
0435nobodyさん03/08/03 17:47ID:???
>>430
ハッシュは(key1,value1,key2,value2・・・)となってるただの配列。
で、配列は展開されちゃうから、
my %hoge = (1=>'a', 2=>'b');
&foo(%hoge, "sample", 123456);

sub foo {
my (%a, $b, $c ) = @_;
}
と書くと、%aには(1,'a',2,'b',"sample",123456)が入り、$b,$cはからになる。
ちなみにリファレンスを使うのが普通だが、使わないでやりたいなら

my %hoge = (1=>'a', 2=>'b');
&foo("sample", 123456, %hoge);

sub foo {
my ($b, $c,%a) = @_;
}

とすることもできる。
0436nobodyさん03/08/03 17:50ID:???
>434に補足してみる。
$a->{HOGE}とやると参照渡しになるので、その中身を変更しようとすると実引数の中身も書き変わる。


$ENV{HOGE} = 'hage';
&foo( \%ENV, "sample", 123456 );
print $ENV{HOGE};  # higeが表示される

sub foo
{
my ($a, $b, $c ) = @_;
$a->{HOGE} = 'hige'
}
0437nobodyさん03/08/03 18:23ID:???
大きいハッシュや配列にリファレンスを使わないと
値を@_へコピーするのに時間がかかる(メモリも喰う)から、
なるべくリファレンスを使うのをお勧めします。
0438nobodyさん03/08/03 18:27ID:???
>>435
> ハッシュは(key1,value1,key2,value2・・・)となってるただの配列
ソースキボンヌ
つーか、ただの配列だったらでかいハッシュに対して$foo{bar}なんてことは気軽に出来ないから、間違いじゃねーの。
0439nobodyさん03/08/03 19:13ID:???
配列型(AV)とハッシュ型(HV)は別物。ただし代入はできます。
044043003/08/03 19:27ID:???
レスどうもです。リファレンス…奥が深そうですね。

Cで言うと、アドレス(orポインター)渡しみたいなもんですか?
なんか、少し混乱気味ヽ(´Д`;)ノ

>>433-435 さんのレスを参考にコーディングしてみます。
0441nobodyさん03/08/03 19:34ID:???
>>440
ポインタを理解してるんなら、覚えるのは早いと思うよ。
0442nobodyさん03/08/03 19:45ID:???
リファレンスを使えるようになったら脱初心者といえますか?
0443nobodyさん03/08/03 20:01ID:???
>>438
ハァ?
>ただの配列だったらでかいハッシュに対して$foo{bar}なんてことは気軽に出来ないから
何をおっしゃってますか?
内部でハッシュ関数を呼び出して、得られた値をインデックスとして使っているのですよ。
配列はランダムアクセスできるからO(1)じゃん。
0444nobodyさん03/08/03 20:04ID:???
>>438
ああ、もしかしてC++で言うこところのlist<string>だと思ってるわけ?間違いじゃねーの。
0445nobodyさん03/08/03 20:46ID:???
>>438
%hogeは配列に見えるし、配列で代入できる。
けれど内部的にはハッシュ。何も問題なし。
0446nobodyさん03/08/03 20:50ID:???
>>443
「ハッシュは...となってるただの配列」は>>435の発言なのでお間違いなきよう。
0447nobodyさん03/08/03 21:55ID:HoJp4WnK
html.gzファイルをopenして書き出してもブラウザにうまく表示されません。
Content-typeの表示が問題と思い、
なんとかEncoding:gzipかなんか書いたんですがだめでした。
何が問題と考えられるでしょう。
0448nobodyさん03/08/03 22:08ID:???
Content-Encoding
0449nobodyさん03/08/03 22:10ID:???
>>447
>>1を読まないのが問題。
2度と来るなとは言わんが、>>1を1日10回読んで1週間後にまた質問しに来い。
今日はもう書き込むな。
0450nobodyさん03/08/04 12:13ID:???
>>449
そういうの辞めて無視し。いい加減バカかと。
0451nobodyさん03/08/04 12:20ID:???
>>450
なら、文句をいわずに、お前が回答しろ。
0452nobodyさん03/08/04 13:19ID:???
そういうの辞めて無視し。いい加減バカかと。
0453nobodyさん03/08/04 13:53ID:???
なら、文句をいわずに、お前が回答しろ。
0454nobodyさん03/08/04 14:08ID:???
コピペやめれ。無視しとき。
0455nobodyさん03/08/04 15:43ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
また過去ログも情報の宝庫です。よく探してみましょうね。

1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

【よくある勘違い】
CGI ≠ Perl です。
判らなければまずはググってみましょう。> http://www.google.co.jp/

【初心者の扱い】
「初心者」だからといっても容赦しませんことよ。ふふふ。
0456nobodyさん03/08/04 15:48ID:???
Perlのソース同士を比べて書き換えたりしたいのですが(差分を取ったりしたいです)、
差分取るソフトで使いやすくて便利なソフト教えてください。
早速、落としてこれから使っていこうと思いますので。
0457nobodyさん03/08/04 15:54ID:???
>>456
diff
0458nobodyさん03/08/04 16:03ID:???
>>457
レスありがとう。
早速HPnなるもいったんですが、分からない…。
0459nobodyさん03/08/04 16:33ID:???
>>438
ソースはここから落とせるよ。
http://www.perl.com/pub/a/language/info/software.html
0460nobodyさん03/08/04 16:47ID:???
diff,patchをうまく使えば効率が良くなるんだが、
>>456の想像しているものとは違う気がする。
気の利いたエディタなら普通についてそうだし、
Windows用のを探しているなら「Windiff」で腐るほどヒットする。
# つか捻りの無いソフト名多すぎ:)
046145703/08/04 16:48ID:???
>>460
# つか捻りの無いソフト名多すぎ:)
だな。俺もさっき調べてたけどWindiffって名前で色んな奴があるよな。
Cygwin入れてるから別にいいんだけどな。
0462nobodyさん03/08/04 20:00ID:IP9MFG+G
>>447
>>449
パソコン買い替え中で正確な記述が調べられないのれす。
でも争いが起きているとは驚きますた。
0463nobodyさん03/08/04 20:02ID:???
>>448
Content-Encoding
これでだと思いますが変わらなかったのですが
鯖が消してしまうとか
0464nobodyさん03/08/04 20:03ID:???
>>462
環境が整わないのに開発なんかしようとするな。
0465nobodyさん03/08/04 20:06ID:???
またファイト
漏れもうすぐネカフェの時間なので
0466あぼーんNGNG
あぼーん
0467あぼーんNGNG
あぼーん
0468あぼーんNGNG
あぼーん
0469nobodyさん03/08/04 20:47ID:???
あるモジュールがあるときでも無い時でも動くようにしたいのですが
負荷を考えると、ループの中でevalを使いたくないのです。
(ループさせる回数がとても多いので。)

現状では、こういう風にやってます。
eval('use Time::HiRes;');
if ( $@ eq undef ) {
  require './lib/bench.pl';
  $HIRES = 1;
  &bench::start;
} else {
  require './lib/dummy_bench.pl';
}

最初にこういう風にしておいて、

続く
0470nobodyさん03/08/04 20:47ID:???
bench.plの中身は

package bench;
use strict;
use Time::HiRes;
sub start {
 処理ほげほげ
}
sub check {
 処理ほげほげ
}
1;

dummy_bench.plの中身は

package bench;
sub start {
}
sub check {
}
1:

Time::HiResが必要な処理の時は
&bench::check
等として呼ばれるわけですが、最初のevalのチェックで失敗してたら
ダミーのほうが読み込まれているので空のサブルーチンが呼ばれます。

このやり方について2点疑問があります。
1.ファイル名とパッケージ名は同一でなければならないと聞いたことがありますが、これはやってはいけない方法なのですか?
2.もっとスマートな方法があるならご教授ください。
0471nobodyさん03/08/04 20:54ID:???
オーバーライドすれば?
0472nobodyさん03/08/04 21:40ID:???
>>469-470
1. 自分が何をやっているのか理解しているなら問題ない。
2. Time::HiRes の存在チェックを bench.pl 内でやれば
  dummy_bench.pl は不要。

#--- Bench.pm ---
package Bench; # 小文字のみのパッケージ名はプラグマ
use strict;
eval ('use Time::HiRes;');
my $EnableHiRes = $@ ? 0 : 1;

sub start;
*start = $EnableHiRes ? sub { ... } : sub { ... };

#--- Bench.pm を使うスクリプト ---
use Bench;
Bench::start();
047346903/08/04 21:50ID:???
ありがとうございます。
とてもためになります!

これがきっかけで
ついでにいろいろ気になることも増えてきたので
勉強中です。。
047446903/08/04 23:32ID:???
事後報告っす。
サブルーチンの定義自体をevalしないと
モジュールがないとき動きませんでした。

sub start;
*start = $EnableHiRes ?
 eval 'sub { use Time::HiRes; ほげほげ }' : sub {};

#単純にevalの中でuseしてもされてないのでこうするしかないような
0475nobodyさん03/08/05 00:29ID:???
>>474
何故また use し直すんだ? 下のコードで試してみ。
Time::HiRes が存在すれば実際に sleep した時間が、
無ければ常に 1 が返ってくる。

#--- Stop.pm ---
package Stop;
use strict;
eval('use Time::HiRes qw(usleep);');
my $Enable = $@ ? 0 : 1;
sub stop;
*stop = $Enable ? sub { usleep($_[0] * 1_000_000) } : sub { sleep($_[0]) };
1;
__END__

#--- test.p ---
#!/usr/local/bin/perl
use strict;
use Stop;
local $| = 1;
print 'foo,';
my $wait = Stop::stop($ARGV[0]);
print "bar. ($wait)\n";
__END__
047646903/08/05 01:03ID:???
あ、動きました。汁
まじすいませんです。

475のコードでもいろいろやってみました。

evalしないと動かなくなっていたのは
以後の処理のほうに問題があるっぽいです。
あるっぽいというのは、最小限の部分だけコード取り出して
いろいろ試してたら今動いたので。

これからじくーり調べます。
ほんとたすかりました。
0477nobodyさん03/08/05 01:12ID:???
my $Enable;
if (require Time::HiRes) {
$Enable = 1;
Time::HiRes->import('usleep');
}
0478nobodyさん03/08/05 05:31ID:???
日本語をブラウザのアドレスバーに入れたとき見たいな文字列に変換したいのですが
具体的には
「日本語 ファイル名テスト用ファイル.txt」を
%C6%FC%CB%DC%B8%EC%20%A5%D5%A5%A1%A5%A4%A5%EB%CC%BE%A5%C6%A5%B9%A5%C8%CD%D1%A5%D5%A5%A1%A5%A4%A5%EB.txt
このようにしたいのです、変換元の日本語はEUC(自身無い)です
今、他人のCGIをいじっているのですがそもそも反対のことをしているのはわかっているのですが
うまく、上の形になりません、何か効率のいい方法はありませんか?
047947803/08/05 05:33ID:???
訂正、
>うまく、上の形になりません、
うまく、上の形の文字列が取得できません
0480nobodyさん03/08/05 06:02ID:???
$str = '日本語 ファイル名テスト用ファイル.txt';
$str =~ s/(\W)/'%'.unpack("H2", $1)/ego;
print $str;
0481nobodyさん03/08/05 10:33ID:???
use Time::HiRes;
と
eval('use Time::HiRes;');
は何が違うの?
0482nobodyさん03/08/05 11:03ID:???
>481
前者は実行できなかった時にコンパイルエラーになる。
後者は実行できなくてもそのまま進む。
0483nobodyさん03/08/05 11:28ID:???
CGIとして使っているperlなのですが、バグが発生し、
俺の実力では原因が特定出来ないので相談にのってもらいに来ました。

ファイルの書き換えなのですが、日頃正常に動いていた動作で、
突然ファイルの中身が消滅してしまい、「0バイトのファイル」になってしまいました。

記述内では、ファイルを書きかえる処理として、

open(FILE,">$log_file");
print FILE $log_code;
close(FILE);

このようなもの「のみ」あり、$log_codeには必ず何かが代入されています。
$log_code に何かが代入されているのはこのプログラムの基本で、代入されていないわけはありません。
また、今回発生したバグと同一の処理は日頃から普通に行っていました。

また、このファイルは複数人数が書き換える物ではなく、
ID登録した「一人の人物」が書き換えるものなので、ファイルロックなどはしていませんでした。

今回のバグで、ファイルの中身が消滅してしまう原因となったアクセス者は、
「俺自身」です。

プログラム作者は俺自身なので、微妙に動作は怪しいですが、今回のは想定外のバグで、原因がつかめないでいます。
記述を考えても、処理自体のバグでファイルが消えてしまった事は非常に考えにくいのですが、

これは取り敢えず、
「処理自体のバグ」を疑うべきでしょうか?
「システムのファイル書き換えミス」を疑うべきでしょうか?

m(__)m
0484あぼーんNGNG
あぼーん
0485nobodyさん03/08/05 11:55ID:???
>$log_code に何かが代入されているのはこのプログラムの基本で、代入されていないわけはありません。
デバッグにおいてこういう思い込みは最大の敵。
必ずテストを行ない、その結果を確認する事。
この場合なら、openの前後の行にprintで$log_codeを表示させてみる。

はっきり言えば、>483の説明だけではなんとも言えない。
情報が少なすぎる。
0486nobodyさん03/08/05 12:24ID:???
再現できなさそうだしopenの前に
die "Error : \$log_code" unless ($log_code);
とか
これを機にいろいろトラップしとき
0487nobodyさん03/08/05 13:14ID:???
>>482 ありがと。
eval 文字列でも、eval { }のように、エラートラップできるとは
知らなかった。勉強になりました。
0488nobodyさん03/08/05 14:17ID:???
>>487
両者の違いは、一気に構文解析がされるかされないか。
eval BLOCKの場合はそうされるので、eval 文字列よりも高速
048948303/08/05 14:46ID:???
>>485-486

ありがとうございます。
同じように再現しようと思っても日頃からやってるのと同じ処理なので困ってました。
今度から、ことごとくプログラム内でエラーチェックしておくようにします。

バグの原因が分からない時ってスッキリしないですね。。。。汗
0490nobodyさん03/08/05 16:01ID:???
一人の人物だからロックしないってありなん?
超高速でダブルクリックして呼び出しかけたらどうなんねん?
0491nobodyさん03/08/05 17:42ID:???
複数窓開くのもあるな。ってか、そのCGIはゲーム系?



クレス
0492名無しさん03/08/05 18:31ID:???
>>483
消えて当然かと。
今まで運良くopenとcloseの間で処理が停止しなかっただけ。
049349203/08/05 18:45ID:???
>>483
もうひと言付け加えると今まで正常に動いていたのは$log_fileが軽かったから。
$log_fileのサイズが臨界点に達すると、鯖がいい加減にしろと作業途中で職場放棄。
049448303/08/05 20:36ID:???
>>490-493
みなさんありがとうございました。
大変参考になりました。

>>492
それを回避するには、ファイルを2つ用意し、バックアップも常に生成しておけ…
と言う事でしょうか?
0495nobodyさん03/08/05 20:58ID:???
排他制御を知らない奴はCGI作るなという事でFA。
0496nobodyさん03/08/05 21:07ID:???
Func (・∀・) Anal
0497nobodyさん03/08/05 21:40ID:???
>>496(・∀・)カエレ!!
0498nobodyさん03/08/05 22:11ID:???
> $log_fileのサイズが臨界点に達すると
どのくらいよ?
0499nobodyさん03/08/05 22:25ID:LRtAIpMc
srand(time|$$);
my $et = int(rand(9));
if($et == 3){
srand(time|$$);
$et =int(rand(2)) ;
if($et == 0) {
�@
}else{
�A
だと、全部�@になります。
2つ目の srand(time|$$); を無くすと、
正常になりますが、どうしてでしょうか?
0500nobodyさん03/08/05 22:25ID:???
>>495
排泄処理…?プロセス事故死の話だろ?

>>494が正解。
ただlogを毎回自動バックアップしてたら壊れたファイルも…ってことになるから、
その変自分のにあったうまい方法を考えておく事。

>>498
perlのメモリ管理はperl自身でやっているから、
つまり鯖によって設定が(ry
0501nobodyさん03/08/05 22:29ID:???
>>499
なんで2回も初期化してるのかは知らんけど。
randの出しかたはアルゴリズムがマシンによって違うぞ。
俺の勘では、それwin系のシステムで使ってないか?
0502あぼーんNGNG
あぼーん
0503nobodyさん03/08/05 23:06ID:???
>>500
> 排泄処理…?
おまるを用意しる!(w
0504nobodyさん03/08/05 23:34ID:???
>>499
これを動かしてみそ。

srand(time|$$);
my $base = rand;
print "base = ", $base, "\n";
srand(time|$$);
print "base*3 = ", $base*3, " rand(3) = ", rand(3), "\n";
srand(time|$$);
print "base*2 = ", $base*2, " rand(2) = ", rand(2), "\n";

しかし、srand(time|$$)って、Win系だと数列がほとんど変化しない予感。
0505あぼーんNGNG
あぼーん
0506nobodyさん03/08/06 01:09ID:???
>>505( -Д-)…
050750403/08/06 01:10ID:???
説明が無いのもなんですので。。
処理系によるかもしれませんが、大抵、srandに同じ乱数シードを与えると
randで読み出す乱数列が同じ物になります。
>>499の複数回のsrand(time|$$)で、$$(プロセスナンバー)は変化しません。
timeは一秒ごとに更新なので、これもほとんど変化しません。
つまりrandの前でsrand(time|$$)を実行することによって、(かなりの確率で)
同じ数列を読み出してることになります。

rand(n)はrand()*nと(最低でもperl5.005_03以降は)等価なので、
int(rand(9))==3が成り立ちrand()値が同じ場合、rand(2)で得られる値は
3.0/9*2=0.666..から3.999../9*2=0.888..までの値になります。
よってint(rand(2))で得られる値は常に0になります。

…多分ね。
0508nobodyさん03/08/06 09:23ID:7imIHn2W
evalについて教えてください。
パッケージ($package)のシンボルテーブルを、%stabで参照できるようにする
コードとして、赤ラクダ本に次のように書いてありました。

local(*stab) = eval("*_$package");
(*_$packageの部分は、Perl5では、*{${package}::}だと思います。)

このevalは何をしているのでしょうか? あっても、なくても同じでしょうか?
0509 ◆hMJAPH9PWA 03/08/06 09:29ID:???
>>508
perl4ではシンボリックリファレンスは使えなかったから、eval()が必要だった。
今ではわざわざeval()する必要はないね。
ついでに型グロブで別名をつける必要も無い。
my $stab_ref = \*{$package."::"};
これでシンボルテーブルへの参照を直接使えばいい。
0510nobodyさん03/08/06 10:57ID:7imIHn2W
>>509さん
どうも有り難うございます。でも、Perl5でシンボリックリファレンスを使え
ないようにして、しかもevalなしでも動いてしまうのが不思議です。

use strict 'refs';
$package = 'main';
local(*stab) = "*${package}::";
while (($key, $val) = each(%stab)) {
local(*glob) = $val;
if (defined $glob) { print "$key => $glob\n"; }
}
0511 ◆hMJAPH9PWA 03/08/06 11:44ID:???
>>510
あ、ホントだ。
多分、perl5からだと思う。
でも折角のstrict 'refs'なのに…変な仕様だね。
■ このスレッドは過去ログ倉庫に格納されています