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

【Perl】初心者コーナー Part18

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/11/20 22:04ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

CGIだけど、なんか質問ある? Part 8
http://pc.2ch.net/test/read.cgi/php/1032704121/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/

過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0684nobodyさん02/12/25 00:41ID:???
>>682 man perlfunc
use Module LIST
use Module
Imports some semantics into the current package from the named module,
generally by aliasing certain subroutine or variable names into your package.
It is exactly equivalent to
BEGIN { require Module; import Module LIST; }
0685nobodyさん02/12/26 02:12ID:wZ43brtn
fork()した後、親プロセスと子プロセスで共通に使える変数(一方の変更が他方に影響を与える変数)
っていうのは使えませんかねぇ。
068668502/12/26 02:53ID:wZ43brtn
次のようにしても親の変更が子に反映されません。
実は685を書き込むまで参照を知りませんでした。
cのポインタみたいに理解しているのが間違いなのだろうか…?

$i = 774;
$ip = \$i;

$$ip++;

if( fork() ){
  while(1){
    print "親:$$ip\n";
    $$ip++;
    sleep(2);
  }
}else{
  sleep(1);
  while(1){
    print "子:$$ip\n";
    sleep(2);
  }
}
0687nobodyさん02/12/26 02:55ID:WbFeNueP
split の逆を うまいことやる方法はないでしょうか?

$abc = "a&b&c";

@pairs = split (/&/, $abc);

↑このような場合に、@pairs から $abc を作り直したいのですが・・・

私では、@pairs の要素数を求めてから、$abc_2 = "$pairs[0]&$pairs[1]&$pairs[2]&・・・"; のようにやっていく方針しか立てられないのです・・・

うまいことやる方法があったら、教えてください。
0688nobodyさん02/12/26 03:09ID:???
>>687
join
068968702/12/26 03:11ID:WbFeNueP
>>688
ごめんなさい・・・本当にありがとうございました・・・
0690nobodyさん02/12/26 04:56ID:???
ちょいと質問です。
Image::Magick の利用で困っているので教えてください。
img.pl というファイルを実行すると下記のエラーがでます。
---
Can't load '/usr/lib/perl5/site_perl/i386-linux/auto/Image/Magick/Magick.so' for module Imag
e::Magick: cannot open shared object file: cannot load shared object file: No such file or d
irectory at /usr/lib/perl5/i386-linux/DynaLoader.pm line 206.
at img.cgi line 4
Compilation failed in require at img.cgi line 4.
BEGIN failed--compilation aborted at img.cgi line 4.
---
一応CUI上でImageMagick は利用可能で、
Perldoc Image::Magic でもマニュアルが見れてます。
Image::Magick をインストールするとデフォルトで
PerlMagickがインストールされるみたいですが、一応再度PerlMagickをインストールしてみたところ、
make test で下記のエラーを見つけました。
---
make: *** [test_dynamic] Error 2
なにか対処法があれば教えてください。
当方の環境
Linux Slackware 8.0
Perl 5.6.1
Image::Magick 5.5.3
0691nobodyさん02/12/26 04:57ID:???
img.pl
---
#!/usr/bin/perl
use lib('/usr/local/lib/site_perl/5.6.0/i386-linux');
use Image::Magick;
$ImageFile = './test.jpg';
$ImageFile2= './test2.jpg';
$i = Image::Magick->new(size=>'320x240');
$x = $i->Read($ImageFile) ;warn "$x" if "$x";
$x = $i->Magnify() ;warn "$x" if "$x"; # 画像を縦横2倍に拡大
$x = $i->Write($ImageFile2);warn "$x" if "$x";
undef $i;
print "Content-type: text/html\n\n";
print "<html><a href=\"../imgtest/test.jpg\">使用前</a><br><a href=\"../imgtest/test2.jpg\">
使用後</a></html>\n";
exit;
0692nobodyさん02/12/26 04:59ID:???
補足:
1 img.pl ではなく .cgi の間違いでした。
2 img.cgi の 4行目は use Image::Magick; になってます。

一度に投稿できなかったので分けて投稿しました。
板汚しですいません。
0693nobodyさん02/12/26 05:15ID:???
自己解決?

vi /etc/ld.so.conf で /usr/lib/perl5/site_perl/i386-linux/auto/Image/Magick/ を追加したら
正常動作しました。

ImageMagickってこういうものなんでしょうか?^^;
0694nobodyさん02/12/26 11:23ID:DQIeVDZ8
質問です。
ただCGIでHTMLを読み込んで表示させたいのですがどうすればよいでつか?
本当にただindex.htmを外から読み込んでそのまま表示させるだけです。
0695nobodyさん02/12/26 11:37ID:???
>694
index.htmをファイルオープンして読み込んで表示するだけだが、
本当にそれしかしないなら、直接index.htmを表示しなさい。
0696nobodyさん02/12/26 11:48ID:???
>>694
index.htmlを読み込んで出力するまえに
適切なヘッダも出力しなきゃだめよ。

Content-Type: text/html

とか
0697nobodyさん02/12/26 14:46ID:???
>>694
なんだ、マルチポストじゃねえか。
別スレで答えて損した。てめえ氏ねよ。
0698nobodyさん02/12/26 18:04ID:???
perlで一定時刻毎に処理をするようなスクリプトはどうすればよいですか?
処理するところは書けたのですが、「一定時刻に」というところでつまづいています。
0699nobodyさん02/12/26 18:04ID:jnr3kh76
G(3);
sub G{
my $a=shift;
if($a>0){
G($a-1);
print"$a\n";
G($a-1);
}print" \#$a\n";
}
この処理の流れが良く理解できません
アドバイスなどお願いします
0700nobodyさん02/12/26 18:14ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
0701nobodyさん02/12/26 18:45ID:???
>>698
ループを作り時刻をチェックし希望の時刻になったら目当ての処理実行が単純
070269802/12/26 18:54ID:???
>>701 それだと常にperlが実行されている状態になりますよね?
0703nobodyさん02/12/26 19:00ID:???
>698
ありがちな方法なら、「最後のアクセスと時間帯が違えば処理をする」という方法。
1時間に1回の方法なら、最後にアクセスした時の「時間(11時とか)」を保存しておき、
「前回の時間と違ったら(11時じゃなくなったら)処理をする」などでやる。
ただし、1時間以上アクセスがなかったら困ったりする事もある。

あと、鯖がかなり限られるがcronもある。
これはスレ違いだから自分で検索すれ。
0704nobodyさん02/12/26 21:25ID:???
>>685
別プロセスのメモリ(変数)をいじることは不可能。
0705nobodyさん02/12/26 23:31ID:???
>>699
普通に関数を再帰的に呼び出してるだけだが?
それ以上説明のしようがない。
0706nobodyさん02/12/27 00:12ID:BkvjWsIw
厨質で申し訳ないんですが、
mod_perl を入れるために、use strict をしておこうと思ったんですが、

$| = 1;
$ENV{いろんな環境変数};

こういうのも my しないとだめなの?
0707nobodyさん02/12/27 00:15ID:???
>>706
グローバル変数っしょ?

つぅか自分で試しても罰は当たらんと思われ・・・
0708nobodyさん02/12/27 00:54ID:qm28R9Zo
https://self.0038.net/cgi-bin/fcc_tel_dialup_inquiry_usage_form.cgi.pl
フュージョン料金明細で必須項目をテキストにあらかじめ記入しておいて
それと現在の日時をもとに一発で明細結果がでるようする方法はあるでしょうか?
いちいち項目をコピペするのが面倒なんです。
070970602/12/27 01:30ID:BkvjWsIw
use strict; って、全部のファイルにしなあかんの?
例えば、
sample.cgi というCGIプログラムがあったとして

use strict;
$| = 1;
require './common.pl';

としていたとしよう。このとき、common.pl にも use strict は書くべきなのか。
それとも、sample.cgi の use strict を引き継いで、
common.pl には、何も書かなくても自動的に use strict されるのか?
0710nobodyさん02/12/27 01:33ID:???
やってみればいーじゃんかよー
071169902/12/27 01:36ID:BtYEwdxr
実行した際に吐き出される値の流れが
途中からよ〜分かりません
どこで値が保持されどの様に順番に吐き出されるのか?
0712nobodyさん02/12/27 01:37ID:???
common.plはなによ?
パッケージならパッケージ変数になってるし、
use strict; しなくてもそのスクリプト内でしか使わないなら、my とかしとけばいいだけじゃない?

>common.pl には、何も書かなくても自動的に use strict されるのか?
no!
0713nobodyさん02/12/27 02:31ID:???
G(3);
sub G{
>>699
実行してみて。
これでわかる?

G(3);
sub G{
my $a=shift(@_);

my($space) = "";
for(my($i)=$a; $i<3; $i++){$space .= " ";}
print "$spaceここからG($a){\n";

if($a>0){
G($a-1);
print"$space$a\n";
G($a-1);
}
print"$space\#$a\n";
print "$space}ここまでG($a)\n";
}
071469902/12/27 08:47ID:???
>>713
ありがとう
なんとなく感じはつかめました
0715nobodyさん02/12/27 10:20ID:???
>>701
その通り、常に実行ですね
>>703
で出てる様にcronを使う手がありますがユーザーに開放している鯖はかなり少な
いし、perl(スクリプト)での質問でしたので>>701としておきました

笑える手として、webサーバーがあるならhtmlより定期的に呼び出すとかもあるけ
ど、これもスレ違い
0716nobodyさん02/12/27 10:46ID:???
>>715
答えが目の前にあるのにすれ違いか。おめでたいな。
0717nobodyさん02/12/27 20:28ID:pRxcckDo
リファレンスについて、詳しく解説している日本語サイトを
ご存知の方がいらっしゃいましたら、是非教えてくださいまそ。
0718nobodyさん02/12/27 20:35ID:yQoOgQCT
http://www.google.co.jp
0719nobodyさん02/12/27 20:38ID:???
>>717
javaの参照とかCのポインタとかをつまみ食いするのも手だと思う。
0720nobodyさん02/12/28 00:49ID:???
>>719
なるほど。javaは出来ないので、Cの方をつまんで来ます。
0721nobodyさん02/12/28 01:10ID:???
ハッシュのリファレンスで

foreach(keys %HASH){
・・・
}

に相当する処理ってできないんでしょうか?
できるのならやり方教えてホスイ。
0722nobodyさん02/12/28 01:34ID:???
>>721
もっと具体的に書く方がよいラスイ。
0723nobodyさん02/12/28 01:39ID:???
$ref= \%hash;
for (keys %$ref){
    print $_,"\n";
}
0724りゅう02/12/28 12:37ID:7mOI1Cp3
参考書に書いてあった簡易掲示板を真似て作ってるんですが、
その本に付属していたCDのサンプルをLocalhostに置くと動くんですが、
自分で真似て作ったやつだと、エラーが出てしまいます。何回も見なおしたけど
違いが分かりません。どなたか違っている個所を教えてくれるとありがたいです。
0725りゅう02/12/28 12:38ID:7mOI1Cp3
CDに入っているサンプル

#!/usr/local/bin/perl

#==========================================================
#メイン処理
#==========================================================
#ヘッダを表示する
&print_header;

#トップを表示する
&print_top;

#==========================================================
#ヘッダの表示
#==========================================================
sub print_header {
  print "Content-type: text/html\n\n";
   print "<META HTTP-EQUIV=Content-Type CONTENT=\"text/html; CHARSET=Shift_JIS\">";
   print "<html>\n";
print "<head><title>Simple BBS</title></head>\n";
print "<body bgcolor=#fffff0 text=#000000 >\n";
}

0726りゅう02/12/28 12:39ID:7mOI1Cp3
#==========================================================
# 入力画面の表示
#==========================================================
sub print_top {
print "<center><table width=600><tr><td>\n";
print "<br><br><center><h2>Simple BBS</h2>\n";
print "<hr> [ <a href=http://www.marutora.net>;Back To Homepage</a> ] <hr></center>\n";
 print "<form method=post action=bbs1.cgi>\n";
print "<input type=hidden size=20 name=action value=regist>\n";
print "<table border=0>\n";
print "<tr><td align=right>名前 :</td><td><input type=text size=20 name=name></td></tr>\n";
print "<tr><td align=right>E-mail:</td><td><input type=text size=40 name=mail></td></tr>\n";
print "<tr><td align=right>URL :</td><td><input type=text size=40 name=url value=http://>;</td></tr>\n";
print "<tr><td align=right>タイトル:</td><td><input type=text size=40 name=title></td></tr>\n";
print "<tr><td align=right>内容 :</td><td><textarea cols=50 rows=5 name=massage wrap=hard></textarea></td></tr>\n";
print "<tr><td colspan=2 nowrap align=right><input type=submit value=送信> <input type=reset value=書き直し></td></tr></table></form>\n";
print "<hr size=0 align=center>\n";
}

_END_
0727りゅう02/12/28 12:40ID:7mOI1Cp3
漏れが作ったものです。よろしくお願いします。(・A・)

#!/usr/local/bin/perl

#=========================================
#メイン処理
#=========================================
#ヘッダを表示する
&print_header;

#トップを表示する
&print_top;

#=========================================
# ヘッダの表示
#=========================================
sub print_header {
print "Content-type: text/html\n\n";
print "<META HTTP-EQUIV=Content-Type CONTENT=\"text/html; CHARSET=Shift_JIS\">";
print "<html>\n";
print "<head><title>Simple BBS</title></head>\n";
print "<body bgcolor=#fffff0 text=#000000 >\n";
}

0728りゅう02/12/28 12:41ID:7mOI1Cp3
#=========================================
# 入力画面の表示
#=========================================
sub print_top {
print "<center><table width=600><tr><td>\n";
print "<br><br><center><h2>Simple BBS</h2>\n";
print "<hr> [ <a href=http://www.marutora.net>;Back To Homepage</a> ] <hr></center>\n";
print "<form method=post action=bbs1.cgi>\n";
print "<input type=hidden size=20 name=action value=regist>\n";
print "<table border=0>\n";
print "<tr><td align=right>名前 :</td><td><input type=text size=20 name=name></td></tr>\n";
print "<tr><td align=right>E-mail:</td><td><input type=text size=40 name=mail></td></tr>\n";
print "<tr><td align=right>URL :</td><td><input type=text size=40 name=url value=http://>;</td></tr>\n";
print "<tr><td align=right>タイトル:</td><td><input type=text size=40 name=title></td></tr>\n";
print "<tr><td align=right>内容 :</td><td><textarea cols=50 rows=5 name=message wrap=hard></textarea></td></tr>\n";
print "<tr><td colspan=2 nowrap align=right><input type=submit value=送信> <input type=reset value=書き直し></td></tr></table></form>\n";
print "<hr size=0 align=center>\n";
}

_END_
0729nobodyさん02/12/28 13:15ID:???
真似て作ったつーか、丸写ししただけかよ。短いスクリプトなんだから、
本と自分で打ったのを一行ごとに交互に並べ替えて見比べろ。
0730nobodyさん02/12/28 13:19ID:???
>>724
どの段階でどういうエラーが出たのかな?

ちなみに単純に違いと言えば最後から3行目のnameが
「message」<=>「massage」
0731nobodyさん02/12/28 13:20ID:???
>>730ミスった
最後から3行目のprintで・・・でした
0732nobodyさん02/12/28 13:30ID:???
>>730
甘やかさん方が良い。それくらい自分で見つけられんと成長できない。
0733nobodyさん02/12/28 13:54ID:aT8fBpaX
>>724
エラーメッセージ貼れ。
0734nobodyさん02/12/28 13:59ID:???
>>732
とも思ったけど「何回も見なおしたけど」辺りが自分とかぶってつい(汗
しかもタイプミスって辺りが尚更かぶってしまた(激汗

しかし参考書もどうかと、完全にトラップでし>massage
0735 02/12/28 14:07ID:???
http://www2a.kagoya.net/~adults-toybox/sample1.wmv
http://www2a.kagoya.net/~adults-toybox/sample2.wmv
http://www2a.kagoya.net/~adults-toybox/
0736nobodyさん02/12/28 17:51ID:???
エラーメッセージも読めんような糞ったれに情けなんかかけるな。もったいない。
0737nobodyさん02/12/28 19:10ID:tgcla43L
imgboardの話なのですが、削除にパスワードは不要ですよね?あれは一体どうやっているのでしょうか。

http://www.big.or.jp/~talk/t-club/soft/mini_r6/index.cgi
↑現在、配布を中止しているようなのですが、なにかご存じの方、よろしくお願いします。

あ、よく知らないのですがimgboardはPerlではないかも・・・
0738nobodyさん02/12/28 19:15ID:???
>>737
ここってさ、使う低脳用の板じゃないんだ。すまんな。
073973702/12/28 19:20ID:tgcla43L
ごめーん。
0740nobodyさん02/12/28 19:52ID:???
「エラーメッセージ貼れ」といったところで、「Internal Server Errorって出てます」って
オチだろうな。

>>724
あんたの作ったやつ、うちのローカル環境で正常に動いたぞ。
0741nobodyさん02/12/28 19:54ID:???
>>740
じゃあ、

#perl -w omaenokuso.cgi

とかの結果張ってもらう?
0742nobodyさん02/12/28 19:57ID:???
解決した質問にいつまでしがみつきやがりますか?
0743nobodyさん02/12/28 21:06ID:???
>>737
IPの第三セグメントまで一致したら削除する仕様
074472102/12/28 23:54ID:???
>>723
ありがとうございます!
それがやりたかったのです。
>>722分かりにくくてスマソ。
0745nobodyさん02/12/29 02:36ID:9gTPrGHJ
"1" を "<" に、"2" を "<<" に、"3" を "<<<" に、・・・、"99" を "<<<・・・<<<" に・・・

こんな感じに置換したいのですが、どのようにすれば良いでしょうか?
例えば、これの逆なら、

for ($i = 99; $i >= 1; $i--)
{
 $text =~ s/(<){$i}/$i/g;
}

という感じにすれば良さそうなのですが・・・

for ($i = 99; $i >= 1; $i--)
{
 $text =~ s/$i/(<){$i}/g;
}

こう書くことができれば、いちばん早いんですが・・・
0746nobodyさん02/12/29 02:44ID:VsdGeM22
>>745

$text=~s/(\d+)/"<"x$1/ge;

不具合がなくもないが。
0747nobodyさん02/12/29 03:06ID:9gTPrGHJ
>>746
ありがとうございました!

ちなみに勉強不足で "\d+" が何を表しているのか分からなかったりするので、それを調べてから試してみます ^^;
0748745 = 747 = 74802/12/29 03:08ID:9gTPrGHJ
\d は [0-9] でしたね ^^;
0749nobodyさん02/12/29 10:13ID:???
不具合が気になる。
0750nobodyさん02/12/29 13:11ID:apFJB7sH
$hoge = "hoge";
の状態で
$hoge の一番後ろに hageと言うのを足す時は
$hoge = $hoge."hage";
とやるしかないのでしょうか?
0751nobodyさん02/12/29 13:12ID:???
>>750
まぁ、それが一番簡単じゃないの?何か不満?
0752 ◆hMJAPH9PWA 02/12/29 13:23ID:???
>>750
$hoge .= "hoge";
0753nobodyさん02/12/29 16:14ID:???
Perlでブラウザゲームを作りたいです。
それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?

0754nobodyさん02/12/29 16:18ID:???
Perlでブラウザゲームを作りたいです。
それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?
Perlでブラウザゲームを作りたいです。
それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?
Perlでブラウザゲームを作りたいです。
それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?
Perlでブラウザゲームを作りたいです。
それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?
Perlでブラウザゲームを作りたいです。
それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?
0755nobodyさん02/12/29 17:32ID:???
>>753-754 > /dev/null
0756nobodyさん02/12/29 17:39ID:???
>>753
javaれや ブォケ
0757nobodyさん02/12/29 20:05ID:???
>>753
とりあえず自分のローカルのOS(Win or Mac)でゲーム作れや。
それを移植する段階になってからこのスレで聞け。
0758nobody02/12/30 14:19ID:???
こんにちは。
WinXP 上でActivePerl を使用しています。
This is perl, v5.6.1 built for MSWin32-x86-multi-thread

何故か do ループの中で last を使用するとエラーになります。

do {
last;
} while (1);

>Can't "last" outside a loop block

while (1) {
last;
}

では問題ありません。last はdo ループの中では使用できないのでしょうか?
last ラベル;
としてもエラーになってしまう…。
0759nobodyさん02/12/30 14:21ID:???
>758
doループの意味わかってる?
ループの前にdo部分をやるから、その時点ではループになってないぞ。
0760nobody02/12/30 14:29ID:???
>>759
if (1) { ほげほげ; }
と
ほげほげ if (1);

の違いみたいな物でしょうか…ちがうかな(苦笑

do ループの中ではlast 文は使えないのかな。
勉強していたサイトの1つの中に
ttp://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_k02.htm
do ループの中でlast 使用できるような所がありますけれど…残念。

レスありがとうございます。
0761nobodyさん02/12/30 14:55ID:???
do はあくまでブロック構文。
whileなどでループ修飾してもループブロックではない。
漏れはPerlはインタプリタ系、スクリプト系だからと妥協してる。
構造化BASICで出来るのもあるし、そのうち対応してくれるとうれしいYO
0762nobodyさん02/12/30 20:31ID:8PVwYuQF
perlの関数内でstatic変数を宣言できるのでしょうか。
0763nobodyさん02/12/30 21:28ID:neFLd3GG
>>759

LOOP:
 {
  do {
   last LOOP;
  }
 }
0764nobodyさん02/12/30 21:29ID:neFLd3GG
あ。>>758だった。
0765nobodyさん02/12/30 21:32ID:neFLd3GG
>>762
{
 my $static;
 sub hoge {
  $static++;
  return $static;
 }
}
0766nobodyさん02/12/30 21:35ID:neFLd3GG
>>763
whileも抜けてた。。
0767nobodyさん02/12/31 00:21ID:???
>>765
ブロック作るんだ。やってみます。ありがとうございます。
0768カミ02/12/31 04:26ID:eTxvyq7o
>>762
use strict;

$aaaa::val = "Global" ;
↑この記法の変数がGlobal変数として扱われる。
0769カミ02/12/31 05:05ID:eTxvyq7o
>>213
$test =<<"TEST";
ここから始まりです。
<FOO>
hogehogehoge
hogehogehoge
hogehogehoge
</FOO>
ここで終わりです。
TEST

という文字列から<HOGE>から</HOGE>までを抜き出したい場合。
Perlでどんな風にかきゃいいんでしょう?
------------------------------
<FOO>から</FOO>の間違いだね。

@picup=();
for (split("\n",$test)){
push (@picup) if /<FOO>/ .. /<\/FOO>/ ;
}

for $ol (@picup) {
print $ol."\n";
}

perl1行野郎参照
ttp://www13.cds.ne.jp/~ohsaru/perl/oneline.html
0770カミ02/12/31 05:18ID:???
>>769 訂正
push (@picup) if /<FOO>/ .. /<\/FOO>/ ;
 ↓
push (@picup,$_) if /<FOO>/ .. /<\/FOO>/ ;
0771カミ02/12/31 06:16ID:???
他で聞くところ無いので私にも教えてください。
某所のコードをモディファイして作成:try.pl
#try , throw ,catch の定義
sub try( &$ ) {
  my( $tryb, $catchb ) = @_;
  eval { &$tryb };
  if ( $@ ) {
   local $_ = $@;
   &$catchb;
  }
}
sub throw {
  die $_[0] ;
}
sub catch ( & ) {
  shift;
}
print "Throw cath Start\n";
try {
 if ($ARGV[0]=~/Exp1/) { throw "Excep1"; }
 elsif ($ARGV[0]=~/Exp2/) { throw "Excep2"; }
 print "Not throw\n";
}
catch {
/Excep1/ && do { print "catch1:$_\n";};
/Excep2/ && do { print "catch2:$_\n";};
};
0772カミ02/12/31 06:19ID:???
>>771
これは思いの他思い通り動きましたが、、
sub try ( &$ ) の&$と
sub catch ( & ) の& の意味が分かりません。
0773nobodyさん02/12/31 09:04ID:???
プロトタイプ厨 降臨

     ↓
0774nobodyさん02/12/31 09:06ID:???
動きません。助けてください。

mhile($i = 1);
print "gohe"
0775nobodyさん02/12/31 09:19ID:???
>>774
ネタ?
0776nobodyさん02/12/31 09:19ID:???
>>775
じゃなきゃ困るだろう。
0777nobodyさん02/12/31 09:20ID:f3dKkAkh
>>772
perlsubに書いてある。そのままサンプルで出てるよ。

http://www.kt.rim.or.jp/~kbk/perl5.005/perlsub.html
> 、&は“sub”キーワードや連続したカンマを要求 しないような無名サブルーチンを要求します。
0778nobodyさん02/12/31 09:31ID:f3dKkAkh
777で、引用してきた和訳はわけわからん・・

An "&" requires an anonymous sub-
routine, which, if passed as the first argument, does not
require the "sub" keyword or a subsequent comma.

&のところに入るのは、無名関数だけど、1つ目の引数としてとられるなら、
subキーワードや、次の引数と区切るコンマは必要ない。
0779nobodyさん02/12/31 09:33ID:???
>>778
&は(“sub”キーワードや連続したカンマを要求 しないような無名サブルーチン)を要求します。

って事じゃないの?subsequentの訳を思いっきり外してる気がするけれど
0780nobodyさん02/12/31 09:41ID:f3dKkAkh
ぅ。自分はこう理解したんだけど・・

↓実験用
#!/usr/local/bin/perl

sub hoge (&&&) {
print join(':', @_) . "\n";
}

hoge {
}
sub {
},
sub {
};
0781nobodyさん02/12/31 11:10ID:aM0LcM99
778が正解
0782nobodyさん02/12/31 11:47ID:YVY0+rTm
   ,.´ / Vヽヽ
    ! i iノノリ)) 〉
    i l l.´ヮ`ノリ <先生!こんなのがありました!
    l く/_只ヽ    
  | ̄ ̄ ̄ ̄ ̄|
http://muryou.gasuki.com/mona/
0783カミ02/12/31 12:01ID:???
>>777-781さん感謝。おかげで頭の中の霧が晴れて来ました。
頂いた内容からその意味コメントしました。この理解で宜しいか?
sub try( &$ ) {
  my( $tryb, $catchb ) = @_;#try内のブロック,catch含むブロックを設定(呼び側ではカンマで区切る必要なし)
        #共に引数として事前評価されているので実行コードとなっている?
  eval { &$tryb };#try内のブロックを実行(dieを判断したいので敢えてeval内で実行)
  if ( $@ ) {
   local $_ = $@;
   &$catchb;#cathブロック実行
  }
}
sub throw {
  die $_[0] ;
}
sub catch ( & ) {
  shift;#catch内のブロックをそのまま実行。左辺の無いshiftは引数をそのまま評価する?
}
print "Throw cath Start\n";
try {
 if ($ARGV[0]=~/Exp1/) { throw "Excep1"; }
 elsif ($ARGV[0]=~/Exp2/) { throw "Excep2"; }
 print "Not throw\n";
}
catch {
/Excep1/ && do { print "catch1:$_\n";};
/Excep2/ && do { print "catch2:$_\n";};
};
0784nobodyさん02/12/31 12:09ID:f3dKkAkh
sub catch (&) {
shift;
}
は、shiftで、引数を一つもってきて、それが最後に評価したものだから、
それを戻り値として返す。っていう意味だね。
sub catch (&) {
return $_[0];
}
と同じ。
結論としては、無名関数のリファレンスが返される。
■ このスレッドは過去ログ倉庫に格納されています