【Perl】初心者コーナー Part18
レス数が900を超えています。1000を超えると表示できなくなるよ。
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あたりを見よう。
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:???0851840
03/01/05 01:08ID:0ij2w7okああ!!申し訳ないです。
わざわざインストールまでしてもらって。
親切にありがとう。
0852nobodyさん
03/01/05 02:42ID:TaQfxWs2在室者リストに(*.dat)に 名前<br> の順で書き込まれている状態から、
退室時にその人の 名前<br> だけを削ろうとして
if (($who ne '') && ($proc eq 'exit')) {
$out_mem = "$who<br>";
open (OUT, "+<$sanka");
flock (OUT,2);
@list = <OUT>;
foreach $outlist(@list) {
$outlist =~ s/$out_mem//g;
print OUT "$list";
}
flock (OUT,8);
close (OUT);
}
と書いたのですが、名前が載りっぱなしになってしまいました。
試しに、 +< を +> に変更したら今度は必要な名前まで
一緒に削れてしまいました。
ご助言をお願いします。
0853nobodyさん
03/01/05 03:02ID:???ファイルの中身をtruncateしてから待避したものを書き出せばいいんじゃないの。
0854nobodyさん
03/01/05 03:02ID:???perlの大罪その1.
print OUT "$list";
↓
print OUT "$outlist";
use strict ;しる。
0855852
03/01/05 03:31ID:TaQfxWs2名前以外を退避…。
そちらに頭が全くまわってなかったです。
アドバイス有難うございます!
>>854
なんという基本的な間違いを。ご指摘有難うございます。
早速修正します。
0856nobodyさん
03/01/05 09:18ID:2NV2xWH6(自分でおいたCGIのせい?)
どうしたら削除できますか?
サーバーはinfoseekです.
0858nobodyさん
03/01/05 09:26ID:2NV2xWH6もう少し詳しくお願いします
0859nobodyさん
03/01/05 09:28ID:???rm -rf ./
0860nobodyさん
03/01/05 09:49ID:???FFFTPとかで消せないって言うか、ファイルが見えないんだろ?
任意のコマンド ってあるから>>859みたいに
chmod 644 ./ファイル名
0861nobodyさん
03/01/05 10:05ID:2NV2xWH6FFFTP ですが 任意のコマンドで chmod 使えません。
どのフォルダのパーミッションをかえればいいのでしょうか
0862nobodyさん
03/01/05 10:57ID:???あそこはnobodyで動いてるから、自分でコーディングもできない利用者は
そりゃハマるだろうよ。
っつうか、そもそもPerlと何の関係が?
0863852
03/01/05 14:32ID:C4pjTkfz不要な名前を削って再度リストに並べ直す方法で巧く出来ました。
本当に助かりました。ありがとうございます。
0864nobodyさん
03/01/05 17:51ID:???いやいや漏れが言いたかったのはここまで有用な言語でありながら
変数定義と参照に関する処理系の警告機構が利用されていない
@listとして定義して$listとしてのアクセスは警告に値する。
(というか、この場合$listってどういう意味が有る?)
-wスイッチで起動すると解決するのか?
0867nobodyさん
03/01/05 23:18ID:LhQ0NrhBまだまだPerl初心者だね。
スカラー、リスト、ハッシュには、別々な名前空間(?)が存在するから、
$list @list %listは同時に使うことができる。
-wを付ければ、定義されていない変数がどーたらって警告が出るし、
use strictをつければ、コンパイル時にエラー(グローバル変数の利用)出て、
実行してくれない。から変数名を間違えたって気づくはず。
0868nobodyさん
03/01/05 23:31ID:+d9WGquVhttp://yahooo.s2.x-beat.com/linkvp/linkvp.html
0869nobodyさん
03/01/05 23:43ID:???その本の作者には何か奇妙な癖のようなものがあって、
スカラー、リスト、ハッシュの変数名に同じ名前を割り当てているケースが多くて、
1行ごとプログラムリストの解説が載っているにもかかわらず、
はじめはわけがわからなかった。
特にforeachのところでは必ずといっていいほど
foreach $hoge(@hoge){}みたいになっていた。
0870nobodyさん
03/01/06 00:07ID:???$i = $i + 10; # $iを10増やす
でつか?
0871おまけ
03/01/06 00:12ID:hDz3fIfAmy $hoge
foreach $hoge (@hoge) { }
2.
foreach my $hoge (@hoge) { }
1よりも2の方がいい。
0872nobodyさん
03/01/06 00:30ID:???例えば
価格。COMみたいな製品評価を皆でするタイプ。
http://kakaku.com/prdsearch/detail.asp?ItemCD=001004&MakerCD=30&Product=FMV%2DDESKPOWER%20C18B
あとは
http://www.jinvestor.com/cgi-bin/bbscode.cgi?c=6748
こんな感じで皆で評価できるタイプを作りたいのですが、初心者なのでよくわかりません。
無料のCGI配布してるとこ等、探しましたが、なかなか上記に見合うタイプのがないです。
何か助言お願いします。もし作り方知ってられましたら是非教えてください。お願いします。
0873nobodyさん
03/01/06 01:15ID:???まずは円グラフがどういうものかの勉強からやり直してきてください。
0874nobodyさん
03/01/06 01:32ID:???GD::Graph::pie使えば円グラフ簡単に作れるけど、GD::Graphが
使えるかどうかは管理者に聞いてくだちい。
0875869
03/01/06 01:52ID:???その本のプログラムはPerl4で書かれていたからmyは使ってなかった。
localも何故かほとんど使ってなくて、
$hogeや@hogeみたいな変数は全てグローバル変数だった。
0878nobodyさん
03/01/06 21:42ID:???アクセスがあるとHTTPの文書を返せればよいのですけれど
0882864
03/01/07 01:48ID:???調べたら簡単に出来るモジュールがあった。
http://search.cpan.org/author/GAAS/libwww-perl-5.68/lib/HTTP/Daemon.pm
そのまんまだ、
サンプルをいじって見れば、、、
0883864 2/3
03/01/07 01:49ID:???----httpd.plとして作成
use HTTP::Daemon;
use HTTP::Status;
my $d = new HTTP::Daemon(LocalPort =>$ARGV[0]) || die;
print "Please contact me at: <URL:", $d->url, ">\n";
while (my $c = $d->accept) {
my ($family, $port, $heraddr) =unpack('S n a4 x8',$c->peername);
while (my $r = $c->get_request) {
print "Accept from:".Socket::inet_ntoa($heraddr)." Port:".$port."\n";
print " User-Agent:".$$r{"_headers"}{"user-agent"}."\n";
if ($r->method eq 'GET' and (-e '.'.$r->url->path)) {
if ($c->send_file_response('.'.$r->url->path)) {
print "Get file: .".$r->url->path."\n" ;
}
} else {
print "Not Respons ".$r->method." ".$r->url->path."\n" ;
$c->send_error(RC_FORBIDDEN)
}
}
print "Close Connection :".Socket::inet_ntoa($heraddr)."\n";
$c->close;
undef($c);
}
----
0884864 3/3
03/01/07 01:50ID:???試しとして同じDIR上にaaaa.htmlを作成
perl httpd.pl 8888 で起動。8888は任意のポート番号
ブラウザからhttp://ホスト名/aaaa.html で表示を確認した。
しかし、これだけだとマルチスレッドとならない為完全な同時アクセスには対応していない。
(先のページには同時に5要求の待ち合わせが出来るように書いてある?)
以上
0885864
03/01/07 01:57ID:???ブラウザからhttp://ホスト名/aaaa.html で表示を確認した。
↓
ブラウザからhttp://ホスト名:8888/aaaa.html で表示を確認した。
0886nobodyさん
03/01/07 03:26ID:???use HTTP::Daemon;
use HTTP::Status;
my $d = new HTTP::Daemon(LocalPort =>$ARGV[0]) || die;
print "Please contact me at: <URL:", $d->url, ">\n";
while (my $c = $d->accept) {
my ($family, $port, $heraddr) =unpack('S n a4 x8',$c->peername);
while (my $r = $c->get_request) {
print "Accept from:".Socket::inet_ntoa($heraddr)." Port:".$port."\n";
print " User-Agent:".$$r{"_headers"}{"user-agent"}."\n";
if ($r->method eq 'GET' and (-e '.'.$r->url->path)) {
if ($c->send_file_response('.'.$r->url->path)) {
print "Get file: .".$r->url->path."\n" ;
}
} else {
print "Not Respons ".$r->method." ".$r->url->path."\n" ;
$c->send_error(RC_FORBIDDEN)
}
}
print "Close Connection :".Socket::inet_ntoa($heraddr)."\n";
$c->close;
undef($c);
}
0887nobodyさん
03/01/07 03:31ID:???use HTTP::Daemon;
use HTTP::Status;
my $d = new HTTP::Daemon(LocalPort =>$ARGV[0]) || die;
print "Please contact me at: <URL:", $d->url, ">\n";
while (my $c = $d->accept) {
my ($family, $port, $heraddr) =unpack('S n a4 x8',$c->peername);
my $pid = fork() ;
if ($pid!=0) {
next ;
}
else {
while (my $r = $c->get_request) {
print "Accept from:".Socket::inet_ntoa($heraddr)." Port:".$port."\n";
print " User-Agent:".$$r{"_headers"}{"user-agent"}."\n";
if ($r->method eq 'GET' and (-e '.'.$r->url->path)) {
if ($c->send_file_response('.'.$r->url->path)) {
print "Get file: .".$r->url->path."\n" ;
}
} else {
print "Not Respons ".$r->method." ".$r->url->path."\n" ;
$c->send_error(RC_FORBIDDEN);
}
}
print "Close Connection :".Socket::inet_ntoa($heraddr)."\n";
$c->close;
undef($c);
}
}
0888nobodyさん
03/01/07 14:19ID:???リファレンスとかバリバリ使ってる初心者は嫌だ。
0889nobodyさん
03/01/07 15:42ID:???一度立った事があるけど、今は残ってない。
初心者と中級者の線引きを決めないと上手くいかないよ。
tu-ka,中級者は自分で調べる事(自力で解決する術)を知ってるから、
あまりこういうところで聞かないんだよな。
0890nobodyさん
03/01/07 23:25ID:???どんどん質問してください。
当然、
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
0891nobodyさん
03/01/08 00:41ID:???if ($fname =~ /filename="(.*)"/){
my $tmp = $1;
if ($tmp =~ /\\/){
for ($fi = (length $tmp) - 1; $fi >= 0; $fi--){
if ("\\" eq substr($tmp, $fi, 1)){
$fi++;
last;
}
}
$fname = substr($tmp, $fi);
}else{
$fname = $tmp;
}
}else{
$fname="";
}
Windowsから十二名の乗客.jpgを取得しようとすると
二名の乗客.jpgとなってしまいます。
どなたか良い方法をご教授ください。
0892nobodyさん
03/01/08 03:07ID:???文字コードをECU-JPにしてその後SJISに戻すとか…
ちなみに処理は1行で
$fname =~ m/([^\\]*)"$/;
print $1;
0894えり
03/01/08 10:27ID:RjcWJJ7/アンインストールしたいのですがどうすればいいですか?
アプリケーションの追加と削除で削除したのですがperlのフォルダーが残っており
又、フォルダーの中身ものこったままです
0896nobodyさん
03/01/08 13:03ID:3CJ1U7Ioたとえば、
テキストファイルに「青」、「うんこ」とあったら
perlで五十音順に並べ替えたりできるんですか?
0898896
03/01/08 14:05ID:???少なくとも読み仮名が無ければ厳しいんですね。
http://www.mytools.net/cgitools/dictionary0.html
こういうの見つけましたが、構成ファイルが多すぎてセッティングしてません。
0900えり
03/01/08 15:39ID:RjcWJJ7/ありがとうございました!!!
0901nobodyさん
03/01/08 20:51ID:OEI4EUTrkakasiを使えば、ある程度は、正しい読み仮名を付けれるよ。
0902nodody
03/01/08 22:13ID:1Pe5J1+Nしてみたいと思っています(スキルアップのために)。
ソースの見やすさを考える以外に気をつけておいた方がいいことが
あればご教授下さい。
Perlを使用します。
(特定の記述法は特に効率が悪いからやめろとか)
0905nobodyさん
03/01/08 22:24ID:???ローカルでテストする。
これ、最優先事項。
0906nodody
03/01/08 22:26ID:1Pe5J1+Nマジで見てくださるのですか!?
じゃあ、マッハでつくります。
>>904
ありがとうございます。
気をつけてみます。
0908nobodyさん
03/01/08 22:30ID:atnjxi5O参考書に載ってなかった。おしえてくだちい。
レス数が900を超えています。1000を超えると表示できなくなるよ。