【Perl】初心者コーナー Part18
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/11/20 22:04ID:???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あたりを見よう。
$hoge .= "hoge";
0753nobodyさん
02/12/29 16:14ID:???それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?
0754nobodyさん
02/12/29 16:18ID:???それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?
Perlでブラウザゲームを作りたいです。
それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?
Perlでブラウザゲームを作りたいです。
それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?
Perlでブラウザゲームを作りたいです。
それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?
Perlでブラウザゲームを作りたいです。
それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?
0758nobody
02/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:???doループの意味わかってる?
ループの前にdo部分をやるから、その時点ではループになってないぞ。
0760nobody
02/12/30 14:29ID:???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:???whileなどでループ修飾してもループブロックではない。
漏れはPerlはインタプリタ系、スクリプト系だからと妥協してる。
構造化BASICで出来るのもあるし、そのうち対応してくれるとうれしいYO
0762nobodyさん
02/12/30 20:31ID:8PVwYuQF0763nobodyさん
02/12/30 21:28ID:neFLd3GGLOOP:
{
do {
last LOOP;
}
}
0764nobodyさん
02/12/30 21:29ID:neFLd3GG0765nobodyさん
02/12/30 21:32ID:neFLd3GG{
my $static;
sub hoge {
$static++;
return $static;
}
}
0766nobodyさん
02/12/30 21:35ID:neFLd3GGwhileも抜けてた。。
0768カミ
02/12/31 04:26ID:eTxvyq7ouse strict;
$aaaa::val = "Global" ;
↑この記法の変数がGlobal変数として扱われる。
0769カミ
02/12/31 05:05ID:eTxvyq7o$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:???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:???これは思いの他思い通り動きましたが、、
sub try ( &$ ) の&$と
sub catch ( & ) の& の意味が分かりません。
0773nobodyさん
02/12/31 09:04ID:???↓
0774nobodyさん
02/12/31 09:06ID:???mhile($i = 1);
print "gohe"
0777nobodyさん
02/12/31 09:20ID:f3dKkAkhperlsubに書いてある。そのままサンプルで出てるよ。
http://www.kt.rim.or.jp/~kbk/perl5.005/perlsub.html
> 、&は“sub”キーワードや連続したカンマを要求 しないような無名サブルーチンを要求します。
0778nobodyさん
02/12/31 09:31ID:f3dKkAkhAn "&" 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:???&は(“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:aM0LcM990782nobodyさん
02/12/31 11:47ID:YVY0+rTm! i iノノリ)) 〉
i l l.´ヮ`ノリ <先生!こんなのがありました!
l く/_只ヽ
| ̄ ̄ ̄ ̄ ̄|
http://muryou.gasuki.com/mona/
0783カミ
02/12/31 12:01ID:???頂いた内容からその意味コメントしました。この理解で宜しいか?
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:f3dKkAkhshift;
}
は、shiftで、引数を一つもってきて、それが最後に評価したものだから、
それを戻り値として返す。っていう意味だね。
sub catch (&) {
return $_[0];
}
と同じ。
結論としては、無名関数のリファレンスが返される。
0785nobodyさん
02/12/31 12:51ID:???ちょっと難しめの本をぱらぱらと読んでみると、
パイプとか、mod_perlとか、よくわからないものばかり。しかも読んでもいまいちぴんとこない。
脱初心者のためにみなさんはどのような事をされましたかっ!?
0786nobodyさん
02/12/31 12:55ID:???大げさなことしなきゃ入門書程度の知識で掲示板くらいは組めるからなぁ。
mod_系はlinuxの勉強してたときに覚えた。パイプはDOSの時名前だけ聞いて
これまたlinuxで本格的に使い始めた。
0787カミ
02/12/31 14:19ID:???てことは、実際ctach内のブロックはsub catch内で実行されるのでなく
sub try の&$catchb;にて戻ったレファレンスが実行されると考えればいいのだね。
PS
ところでmod_perって何?
0788nobodyさん
02/12/31 14:37ID:???0789nobodyさん
02/12/31 14:51ID:???検索すれ。
0791nobodyさん
02/12/31 15:12ID:TZQCX2rE0794791
02/12/31 15:25ID:???for (1..10){
last if(FTP先の削除したいファイルが削除できたら)
削除処理
}
のような形にしたいんです。
ホウホウワカリマスデスカ?
0796791
02/12/31 15:33ID:???1. FTPで指定されたホストにログイン
2. ディレクトリィの移動
3. ファイルを削除するまで削除処理を実行する
4. 削除完了後にログアウト
この一連の処理を行いたいです。
0799nobodyさん
03/01/01 12:49ID:???1 RFC959読む。他に拡張もあるが>>791の目的にはこれで充分だろう。
2 ftpをデバッグモードで動かしてRFCを理解する。
3 Net::FTPを入手して使う。
0800nobodyさん
03/01/01 19:44ID:???今年も過疎板でがんばろー (・□・)ノ
0801nobodyさん
03/01/01 22:24ID:lIl6EtKn\(a => \@list_a,
b => \@list_b,);
の場合、list_aの配列を取るにはどう書けばいいのですか?
0802nobodyさん
03/01/01 22:48ID:lIl6EtKnmy @list_a = @{${$hash_ref}{a}};
で逝けました。
0804nobodyさん
03/01/01 23:17ID:ItqiYY13http://yahooo.s2.x-beat.com/linkvp/linkvp.html
0805nobodyさん
03/01/01 23:31ID:RvFz9efrmy @list_a = @{$hash_ref->{a}};
の方が普通・・だと思う。
0806nobodyさん
03/01/01 23:33ID:RvFz9efrmy $hash_ref = {
a => \@list_a,
b => \@list_b,
};
0807nobodyさん
03/01/01 23:50ID:RvFz9efr(\$a, \$b, \$c)と、\($a, $b, $c)は同じ。つまり、
my $hash_ref =
\(a => \@list_a,
b => \@list_b,);
これは、(\'a', \\@list_a, \'b', \\@list_b)と同じだから、
左がスカラーだから、コンマ演算子で、、$hash_refには、最後の、
\\@list_bが入る
0811カミ
03/01/02 03:38ID:???例えば
$aaa = "aaa";
print ${aaa} ;#aaaが表示
このように変数名そのものは$と言う連想配列の要素らしい事がわかる
0812nobodyさん
03/01/02 23:36ID:L6yfXpSSそれはちょっと無理が・・
その書き方は、単純に、変数名の区切りをはっきりとさせる。というだけだね。
$aaa = "hogehoge";
print "test:$aaabbbccc"; #test:だけ表示
print "test:${aaa}bbbccc"; #test:hogehogebbbccc
0813nobodyさん
03/01/02 23:54ID:L6yfXpSSわかりにくい部分は、、コンマ演算子の所かな。違うか。
$a = ('a', 'b', 'c'); #$aにはcが入る
$a = 'a', 'b', 'c'; #これは上の普通の書き方。$aにはcが入る
@a = ('a', 'b', 'c');
$a = @a; #これは$aには3が入る
0814yani ◆saNSktNEdQ
03/01/03 00:28ID:0E5Ge7qRと言ったほうがいいかも知れない。
qw(...)でも同じように働くから。
しかし本当のところはPerlのソースコードを読まないと分からないのかも知れない。
内部的にコンマ演算子使ってるかもしれないし。
0815nobodyさん
03/01/03 00:57ID:???コンマ演算子は代入演算子より優先順位が低い。
$a = 'a', 'b', 'c'; # これはaが入る
@a = 'a', $b = 'b', 'c'; # これは @a = ('a'); $b = 'b'; 'c' と同じ
0816813
03/01/03 01:13ID:nupLg+Ov0818カミ
03/01/03 16:20ID:???しかし、ちと違うが下の様な実験結果もしてみた。
$hash{array} = [ 1,2,3 ];
$s = scalar $hash{array} ;
if ($s =~/^ARRAY/ ) {
print "scalar :$s\n" ;
for (@{$s}) {
print $_."\n" ;
}
}
1;
これを実行
scalar :ARRAY(0x183f04c)
1
2
3
この場合 @と言う連想配列の要素にARRAY(0x183f04c)が有る様に思える。
0821nobodyさん
03/01/03 21:46ID:nupLg+Ovそんな難しいことしなくても、Data::Dumperを使うとざざーっと出してくれる
>>811でも変なこと言ってるけど、名前の部分が空っぽの記号だけの変数なんて存在しない。
>>812を読めばわかるじゃろ。
0823nobodyさん
03/01/03 22:57ID:???0824yani ◆saNSktNEdQ
03/01/04 00:02ID:8PdubkBh0825yani ◆saNSktNEdQ
03/01/04 00:03ID:8PdubkBh0826カミ
03/01/04 00:38ID:???先の実験で私が感動したのは
$s = scalar $hash{array} ;して if ($s =~/^ARRAY/ ) {が真になる。
$sにはARRAY(XXXXX)というキーとなる値が入り
@{$s}にて@なる連想配列(配列の親玉の様な)から配列を参照できる。
この様に思えるコードが実行されたところです。
もちっと http://www.kt.rim.or.jp/~kbk/perl5.005/perlref.html を勉強します。
PS
無名関数ってラムダですよね?
0828nobodyさん
03/01/04 17:29ID:???>$s = scalar $hash{array}
で$sにARRAY〜が入っているのは
scalarがリファレンスを返したりもするのですね。
>@{$s}にて@なる連想配列(配列の親玉の様な)から配列を参照できる。
@なる連想配列云々は普段使用している参照となにも変わらないような・・・
$s = \$hash{array};
for each (@$s) { etc... }
リファレンスが入っているのなら
@{$s} は @$sそのものですし。。
0829nobodyさん
03/01/04 18:11ID:???で$sにARRAY〜が入っているのね。
の間違いです。ごめん。。
scalar がリファレンスを返したのは
= [1, 2, 3];
で定数配列? を代入させたからですか・・・
納得。
0830nobodyさん
03/01/04 18:51ID:???my $a = ['aho'];
print $$a[0];
$$a[0] = 'baka';
print $$a[0];
って代入もできるから定数ではないYO
\[etc...]
で定数配列になる
この変数はアドレスだけで、特に名前は存在しないから
無名変数と言えなくもない
変数名はただのメモリアドレス識別子ともいえるから
特に強調することではないYO
0831nobodyさん
03/01/04 19:08ID:???404 Not Foundを返すファイルへの対処方法を教えてください。
正常 http://www.yahoo.com/index.html ダメ :http://www.google.co.jp/index.html
$url="http://www.yahoo.com/index.html";
$url =~ s/http\:\/\///g;
@list = split('/',$url);
$host = shift(@list);
$file = pop(@list);
push(@list,$file);
$path = join('/',@list);
$addr = (gethostbyname($host))[4];
$name = pack("S n a4 x8", 2, 80, $addr);
@data;
socket(S, 2, 1, 0);
connect(S, $name);
binmode(S);
select(S); $| = 1; select(stdout);
print S "GET /".$path." HTTP/1.0\r\n\r\n";
while (<S>) { push(@data,$_); }
close(S);
$delnum = 1;
foreach(@data){ $delnum++; if(/Content-Type:/){ last; } }
splice (@data,0,$delnum);
open OUT,">$file";
binmode OUT;
foreach $var(@data){ print OUT$var; }
close OUT;
0832nobodyさん
03/01/04 19:49ID:???わざわざsocketを使っているのって凄いでつね。
どんな環境(OSなど)かは判りませんが、楽してモジュール使うとか、system 'wget -色々'; とか使った方が楽なような気がしまつでつ。
あと、UA送信した方がよいかもしれません。
それともPerlが、勝手に付けてくれるのかな?
(自鯖ではUA無しは即アク禁にしていまつ。)
0833nobodyさん
03/01/04 19:50ID:???件の
http://www.google.co.jp/index.html
は・・・GETだけですと、302のLocationを返すみたいですね。
試してみた限りではHost: を送信するとウェプページが返ってきました。
print S "GET /".$path." HTTP/1.0\r\n";
print S "Host: hogehoge\r\n";
print S "\r\n";
グーグルではHost: もチェックしているようです。
0834831
03/01/04 22:18ID:BNGRljfr>>833 さん
レスありがとうございます。
ググルは御陰様で解決しました。
404を返していた(個人サイトなので公開は控えておきます)サーバは
RefererにHostを入れて送ることで正常に取得出来ました。
どうやら直リンクを禁止してたようです。
>system 'wget -色々';
窓ユーザーなのでPerlからUNIXのコマンドが使えるとは知りませんでした。
これを機会にUNIXの勉強をしようかと思います。
#改良版
print S "GET /".$path." HTTP/1.0\r\n";
print S "Accept: */*\r\n";
print S "Referer: http://".$host."\r\n";
print S "Accept-Language: ja\r\n";
print S "Accept-encoding: gzip, deflate\r\n";
print S "User-Agent: Mozilla/4.0\r\n";
print S "Connection: Keep-Alive\r\n";
print S "Host: ".$host."\r\n";
print S "\r\n";
0835nobodyさん
03/01/04 22:27ID:tgEtvNOB場所をちゃんと指定した変数(?)を使わないといけない場合(use strict)に使う。かも。
%::a == %main::aだから・・
0836偽PG
03/01/05 00:04ID:X0VKDjVoオンラインで利用可能なツールの作成を考えている状況です。
あるWEBページがあります。
そのページには「IDNumber的な数字」「誕生国」「人名」が並んでいます。
上記はID=人名の関係です。
例)
ID=1 / 誕生国=日本 / 人名=豊臣秀吉
ID=2 / 誕生国=中国 / 人名=諸葛孔明
【考えているツールの流れ】
�@入力フォームを用意して文章を入力する。
(文章には不要情報も含まれている)
↓
�A文章中にIDが存在する場合、そのIDに該当する生まれ情報を
指定WEBページより取得する。
(WEBページの中にテーブルでID・誕生国・人名が並んでいる)
↓
�B取得した誕生国情報が日本3人・中国2人と複数存在した時には
それぞれの誕生国の数をカウントする。
↓
�C結果をHTML形式にして表示させる。
ローカルの情報ではなくWEBページから情報を取得して
カウントする事は可能なのでしょうか?
いちいちWEBページの情報を参照するのが面倒だと思って
作成を考えた次第です。
方法等はちょっと思いつきに近いものがあります。
スレ違いなら申し訳ないです。
0838偽PG
03/01/05 00:15ID:X0VKDjVoこれからWEBプログラムを学ぼうとしたのに
こんな所で突っ込まれては俺もダメですな。マジ勉強しなきゃ。
0839nobodyさん
03/01/05 00:17ID:???ああ、すまんな。言い過ぎた。
>ローカルの情報ではなくWEBページから情報を取得して
>カウントする事は可能なのでしょうか?
サーバが外にコネクションを張ることを許可しているならできる。
0840nobodyさん
03/01/05 00:29ID:0ij2w7ok実行できないで困っています。ActivePerlをインストールしました。インストール
先はc:\perl\binになっていました。pathも通っているので、DOSプロンプトで
perl -vとやってみると、ちゃんとバージョン情報がでるので、一応動くようなのですが
ブラウザからCGIを実行させようとするとできません。*.plファイルの最初の一行は
#!/perl/bin/perlとしているのですがこれが間違いでしょうか?
エラーメッセージは
Error 500
CGI エラー - Content-Type ヘッダが正しくありません。
CGI 出力メッセージ:
'perl' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
となるんですが、どなたか助言お願いします
0846840
03/01/05 01:00ID:0ij2w7okそれはどこで設定するのでしょう?
とりあえずDocumentRootの設定と/~UserNameと /cgi-bin/の仮想パスとローカルパス
というところはチェックしてみました。その他はいじってません
0848840
03/01/05 01:04ID:0ij2w7okすいません。やっとわかりました。
「#!の行を調べる」というチェック項目があってそこに
チェックをいれたら実行することができました。
ありがとうございます。スレ違いごめんなさい。
0849847
03/01/05 01:05ID:???拡張子ごとの設定の編集のところで、「#!の行を調べる。」という項目があるでしょ。
そこにチェックを入れてみて。
0850849
03/01/05 01:05ID:???■ このスレッドは過去ログ倉庫に格納されています