Perlコーディング初心者質問スレ Part 41
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
05/03/10 00:47:16ID:sT66OcmD【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0231nobodyさん
05/03/19 22:08:29ID:???さっきまでたっぷり寝たのに日本語がわかんない
今度は寝すぎかな?
0234nobodyさん
05/03/19 22:51:45ID:???つまんないネタになるだけだと思うので
お邪魔しました
0235nobodyさん
05/03/20 00:27:27ID:???0236nobodyさん
05/03/20 00:33:08ID:???0237nobodyさん
05/03/20 02:15:24ID:???print "Hello Unko World!\n";
}
0238nobodyさん
05/03/20 03:10:16ID:???0239nobodyさん
05/03/20 03:22:48ID:???0240nobodyさん
05/03/20 11:54:57ID:???datファイルに書き足していきたいだけだろ?
ファイル操作のあたりを調べてみなさい。
それとテスト環境を作って自分で色々試しなさい。
どうせサーバーで直接試してるんだろうから。
0241nobodyさん
05/03/20 13:14:23ID:RNFnJUaq動作確認後、サーバーにアップロード、という手順で開発してるのですが、
perlスクリプトの一行目のperlスクリプトの指定を、
#!c:/Program Files/perl/bin/perl
から、アップロードの時だけいちいちサーバのパス指定に合わせて
#! /usr/local/bin/perl
と書き換えています。結構面倒だし、変更を忘れてエラーになることも
しばしばです。何かスマートな方法があるのではと思ってるのですが、
アドバイスいただければ幸いです。
0242nobodyさん
05/03/20 13:30:13ID:???0243nobodyさん
05/03/20 14:04:16ID:???Apache 1.3.xなら、.cgiの拡張子をPerlに関連付けすると、
シェバングパスを無視して実行してくれる。
私はそうしてる。
0245nobodyさん
05/03/20 16:24:18ID:???0246nobodyさん
05/03/20 17:22:51ID:Z0GAs5yv編集画面はしっかり編集されるのですが編集を実行すると
$params{'body'}の値が数字になってしまいます
$params{'body'}の部分にはタグも表示できるようにしてあるのですがそれが関係しているのでしょうか
三日三晩眺めてみてもどうしてもわかりません…
ご教授お願いします。
0247nobodyさん
05/03/20 17:26:02ID:???my $kugiri = "<<>>";
if ($params{'pass'} ne $pass) { &error("パスワードが違います"); }
# 編集
if ($params{'c'} eq "topedit") {
if (!$params{'body'}) { &error('入力がありません'); }
$params{'body'} =~ s/\r\n/\n/g;
$params{'body'} =~ s/\r//g;
$params{'body'} =~ s/\n/<br>/g;
$params{'body'} =~ s/&/&/g;
$params{'body'} =~ s/</</g;
$params{'body'} =~ s/>/>/g;
$params{'body'} = ~s/"/\"/g;
open(OUT,">setup.dat") || &error("setup.datを開くことができません");
print OUT "$params{'body'}$kugiri$params{'title'}$kugiri$params{'text'}$kugiri$params{'bgcolor'}$kugiri$params{'link'}$kugiri$params{'vlink'}$kugiri$params{'alink'}$kugiri";
close(OUT);
# 完了
&head;
print "<b>設定完了</b>\n";
&footer;
exit;
}
0248246-247
05/03/20 17:26:57ID:???$file = <IN>;
close(IN);
($body,$title,$text,$bgcolor,$link,$vlink,$alink) = split(/$kugiri/, $file);
$body=~s/<br>/\n/ig;
$body=~s/&/&/g;
$body=~s/</</g;
$body=~s/>/>/g;
$body=~s/\"/"/g;
&header;
print <<"EOM";
編集<br>
<form action="$cgi" method=post>
<input type=hidden name=pass value=$params{'pass'}>
<input type=hidden name=mode value=top>
<input type=hidden name=c value=topedit>
<textarea name="body" rows="10" cols="50" istyle="1">$body</textarea>
<br>
$title,$text,$bgcolor,$link,$vlink,$alinkのinputフォームは割愛<br>
それときったないソースでスマソ
<input type=submit value=送信>
EOM
&foot;
exit;
}
sage忘れスマソ…_| ̄|○
0249nobodyさん
05/03/20 17:58:57ID:???>$params{'body'} = ~s/"/\"/g;
0250T女の竹田
05/03/20 18:16:49ID:???せっかくPerlには便利なデバッガが付いてるんだから、使わないと損だよ。
三日三晩眺めてた、って。
CGIならその場で環境変数とか設定したらいいから。
0251246-248
05/03/20 19:22:11ID:???こういうポカミスって気付かないものですね
>250
Σ(´д`)それがありましたね
今度からはしっかりそれ試してます…
ではありがとうございました
0253nobodyさん
2005/03/21(月) 18:10:57ID:3f95qFz7何かよい方法はありますか?
具体的に言いますと、
$aaa[0]='bb';
$aaa[1]='aa';
$aaa[2]='cc';
を各値で昇順ソートし場合、@result=(1,0,2) という結果が欲しいのです。
下記のコードでは、それらしい結果は得られるのですが、確信が持てないのです。
$aaa[0]='bb';
$aaa[1]='aa';
$aaa[2]='cc';
$xxx[0]=0;
$xxx[1]=1;
$xxx[2]=2;
@result=sort {$aaa[$a] cmp $aaa[$b]} @xxx;
よろしくお願いします。
0254nobodyさん
2005/03/21(月) 19:48:18ID:???@result = sort{ $xxx[$a] cmp $xxx[$b] } (0..$#xxx);
@result = sort{ $xxx[$a] <=> $xxx[$b] } (0..$#xxx);
0255254
2005/03/21(月) 19:50:42ID:???my @result = sort{ $aaa[$a] cmp $aaa[$b] } (0..$#aaa);
0257nobodyさん
2005/03/25(金) 22:58:43ID:???0259nobodyさん
2005/03/26(土) 09:14:22ID:???0260nobodyさん
2005/03/26(土) 09:17:47ID:pZwBUwH20261nobodyさん
2005/03/26(土) 12:04:22ID:???0262nobodyさん
2005/03/27(日) 02:19:06ID:eF4YrThJaaa
aab
aac
aad
........
zzx
zzy
zzz
のように上から舐めていくのってどうすればいいですか?
0263nobodyさん
2005/03/27(日) 02:46:04ID:???for $y('a'..'z'){
print "$x$y\n";
}
}
0264nobodyさん
2005/03/27(日) 05:22:23ID:???while (++$str =~ /\A[a-z]{3}\z/) {
print "${str}\n";
}
0267262
2005/03/27(日) 10:17:27ID:???perlだけに時間さくわけにもいかんしな。
0268nobodyさん
2005/03/27(日) 10:18:22ID:???0269nobodyさん
2005/03/27(日) 15:26:22ID:???人にラクダ本すすめといて自分で読んでないやついるだろ!
0270nobodyさん
2005/03/27(日) 17:51:21ID:???0271nobodyさん
2005/03/27(日) 17:56:41ID:???perlだけに限らんけど、
there's more than one way to do it.
'aaa'..'zzz' つー記法はperlってこんなこともできるんだよスゲー、て紹介の仕方で良く引用されてるような。
0274nobodyさん
2005/03/27(日) 20:04:20ID:???0275nobodyさん
2005/03/27(日) 21:30:34ID:???0276nobodyさん
2005/03/28(月) 00:13:11ID:???最近はphpばかりでCGIではPerl使わないしなぁ。
'aaa'..'zzz'はちょっと感動。
試しにベンチ取ってみた。
Benchmark: timing 10000 iterations of A, B...
A: 3 wallclock secs ( 3.24 usr + 0.01 sys = 3.25 CPU) @ 3076.92/s (n=10000)
B: 2 wallclock secs ( 2.16 usr + 0.00 sys = 2.16 CPU) @ 4638.22/s (n=10000)
A=>>263
B='aa'..'zz'
0277nobodyさん
2005/03/28(月) 03:16:21ID:kLN9+ZWUいろいろ調べたけどわかりません。
socketとか使うんすかね?
ちなみにサーバーは@niftyです。
もしやsocketのせい?
0279nobodyさん
2005/03/28(月) 12:03:12ID:???10年以上昔の俺は赤ラクダを真剣に読んだ。当時はまだ読めた。
今青ラクダを2冊とも読み通せと言われるとちょっと辛い。
>>277
他サーバから http で get してきた HTML ファイルを表示したいのか?
ttp://oshiete1.goo.ne.jp/kotaeru.php3?q=1205000 を見る限り道は険しそうだが
0280nobodyさん
2005/03/28(月) 13:44:59ID:???ID(例えばdiaryとかtalkとか)を自由に登録・ID自体の編集もできるスクリプトになっています
実質カテゴリわけとかそんなかんじでしょうか。
open(IN,"$setup") || &error("開けない");
while (<IN>) {
($id,$disp) = split(/,/);
if ($id eq $in{'id'}) { &error('存在するIDです'); }
}
close(IN);
今は上記のようになっていますがこれですと
今編集しようとしている$setup内の行がマッチしてしまうわけで。
何か良い記述方法はないでしょうか?
0281nobodyさん
2005/03/28(月) 13:55:54ID:???open(IN,"$setup") || &error("開けない");
これなら読み込みしかできない。$setupのファイルは編集できない。
while (<IN>) {
($id,$disp) = split(/,/);
if ($id eq $in{'id'}) { $flag=1; &error('存在するIDです'); }
}
close(IN);
if ($flag == 1) {
open(OUT, ">> $setup") or die $!, "\n";
print "$id\t$disp\n";
close OUT;
とか。
0282nobodyさん
2005/03/28(月) 13:56:45ID:???0283nobodyさん
2005/03/28(月) 15:15:23ID:???・データファイルは
2,説明,
1,説明,
のようになっていて、複数登録が可能になっている(別サブルーチン)
・ID(変数は$id),説明($disp)をフォームから編集可能にしたい
例えばID2を1にする場合にはエラー,2を2のまま編集する場合はエラーは出さないようにしたい
・現状だと編集中のIDがマッチするためエラーが出てしまう
・編集中のID以外をマッチさせる方法はないか?と考えたが上手い記述が見つからず
・スクリプトの記述方法は某有名所にかなり依存
・排他処理関係の関数は抜かし、他も簡略化しつつソースを晒してみた
ttp://yu.to/perl/up/id.txt
281氏の書き方だとflag==1の時、つまり同IDがある時編集可能になっちゃいますよね
0284nobodyさん
2005/03/28(月) 15:21:44ID:???0285nobodyさん
2005/03/28(月) 15:32:19ID:???つーか何がしたいのかわからんのだが
IDと説明を入力させるんだろ?で、
・ID が存在しなかったら登録
・ID が存在したら説明を上書き
ってことか?しかしそうなると
>・ID(変数は$id),説明($disp)をフォームから編集可能にしたい
> 例えばID2を1にする場合にはエラー,2を2のまま編集する場合はエラーは出さないようにしたい
>・現状だと編集中のIDがマッチするためエラーが出てしまう
>・編集中のID以外をマッチさせる方法はないか?と考えたが上手い記述が見つからず
ここらへんが意味不明なんだが
0286nobodyさん
2005/03/28(月) 16:14:33ID:???・要求仕様自体がバグってる
のどっちかな気がする。
0288nobodyさん
2005/03/28(月) 16:43:13ID:???0289280=283
2005/03/28(月) 18:04:51ID:???>・絶望的に説明が下手
たぶんこれだなorz
こちらのしたいことが明確に伝わらなくて申し訳ないです
>・ID が存在しなかったら登録
はまあ合ってるんだけど
>・ID が存在したら説明を上書き
はちょっと違うかな
ID自体も編集できるようにしたいのです(説明はたんなるオプションでしかないから)
※
ユーザーアカウントをWEB上で登録・編集・削除したい…みたいな。
イメージとしてはそんなかんじです。
そういうアカウントとかだと登録はもちろん編集する時もIDについては重複させるわけにはいかないので。
>284氏に助言いただいたこともあるのでもう一回組みなおしたりググったりしてみます
0290nobodyさん
2005/03/28(月) 18:11:01ID:???0291nobodyさん
2005/03/28(月) 18:29:41ID:???当然といえば当然なんだが、idが変更されたかどうかを知るためには、
以前のid・新規idの2つがスクリプトに渡されなければならない。
0292nobodyさん
2005/03/28(月) 18:34:40ID:???データ構造の設計から見直した方が良いんじゃないですかね?
0293nobodyさん
2005/03/28(月) 19:55:25ID:TfqpURTV0297nobodyさん
2005/03/28(月) 21:23:02ID:???やっと分かった。
IDは使われていない番号への変更が可能ということなんだ。
すっきり。
データ構造とファイルの扱いが分からないので、簡単に。
編集=新しいIDの登録+古いIDの削除。
または、IDをただのデータとして扱ってIDを書き換える。
0298nobodyさん
2005/03/29(火) 17:27:53ID:???ラクダ本とやらを見に行ったらすんごく面白かった。
学生には高すぎるよorz
0299nobodyさん
2005/03/29(火) 17:33:36ID:???0300280
2005/03/29(火) 19:10:54ID:???至らない所が多々ありすみませんでした。
最初からそう説明してればよかったのか。
結局、297氏の案+αで自分のやりたいことができるようになりました。
もちっとスキルアップしてきますorz
それでは、スレ汚し失礼しました。
0301nobodyさん
2005/03/29(火) 21:35:34ID:???0302301
2005/03/29(火) 21:44:57ID:???@result{'minus30'}->[]という無名配列にpush出来る方法ってないでしょうか?
0303nobodyさん
2005/03/29(火) 21:54:38ID:???0304301
2005/03/29(火) 22:10:40ID:???ここら辺についての理解が怪しいので、もう一回勉強してきます〜。
0305nobodyさん
2005/03/30(水) 18:04:36ID:???一気にデリファレンスしてくれる関数が欲しいのですが
他にも方法があったら教えてください。
#一括デリファレンス関数の定義
sub list:lvalue{@_?(${$_[0]},list(@_[1..$#_])):@{[]}}
#以下使用例
@a = \($a,$b,$c,$d,$e);
if($case){
(list(@a)) = qw(aa bb cc dd ee);
}else{
(list(@a)) = qw(AA BB CC DD EE);
}
print "$a,$b,$c,$d,$e";
0306nobodyさん
2005/03/30(水) 19:45:23ID:???@a = (\$a,\$b,\$c,\$d,\$e);
0308nobodyさん
2005/03/30(水) 22:07:20ID:???sub list:lvalue{@_?(${+shift},list(@_)):@{[]}}
0310nobodyさん
2005/03/31(木) 05:57:08ID:???0311nobodyさん
2005/03/31(木) 06:09:24ID:???プロトタイプ宣言したほうがいいんかも。
てか、lvalueってPerl5.6以上限定だね。
sub list(@):lvalue{@_?(${+shift},list(@_)):@{[]}}
@a = \($a,$b,$c,$d,$e);
if($case){
(list @a) = qw(aa bb cc dd ee);
}else{
(list @a) = qw(AA BB CC DD EE);
}
print "$a,$b,$c,$d,$e";
0312nobodyさん
2005/03/31(木) 08:25:29ID:???http://www.bot-depot.com/forums/?showforum=12
ここの
http://www.bot-depot.com/forums/index.php?act=Attach&type=post&id=629
これを落としたんですが、上手く動きません…。
とりあえず最新のActivePerl入れてXP SP1上で動かしてるだけなんですが、
他に何か必要なんでしょうか。
落としたファイルの内書き換えた場所は、echobot.plの
my $handle = '自分のhotmailアドレス';
my $password = 'パスワード';
my $admin = '自分のhotmailアドレス';
のみなんですが…。
何かアドバイスなどよろしくお願いします…。
0313312
2005/03/31(木) 08:27:17ID:???よろしくお願いします…。
MSN 2.0 (01/21/2005) Rev: 84 - Checksum: 60068-NS18164-SB8878
SERVER ERROR : Authentication Error: No response from Passport server
ERROR : Trying to print 'PNG
' on an undefined socket
Caller trace:
0: MSN::error (MSN/Notification.pm, line 102)
1: MSN::Notification::error (MSN/Notification.pm, line 189)
2: MSN::Notification::_send (MSN/Notification.pm, line 519)
3: MSN::Notification::ping (MSN.pm, line 669)
4: MSN::do_one_loop (echobot.pl, line 44)
0314312
2005/03/31(木) 08:30:28ID:???質問がスレ違いならよろしければ該当スレに誘導して頂ければありがたいです。すいません。
0315nobodyさん
2005/03/31(木) 09:40:58ID:???軽い画像(5kb程度)なら上手くいくものが重い画像(10kb以上)になると
動作しなくなってしまいます。
・アップロード&保存
軽い画像→OK、重い画像→OK
・アップロード&保存&ImageMagick処理
軽い画像→OK、重い画像→×
・ImageMagick処理(別スクリプト)
軽い画像→OK、重い画像→OK
こんな感じで保存とImageMagick処理を同じスクリプトでやろうとすると
上手くいきません。画像処理の実行に関わらず、スクリプト内で
use Image::Magick;しているとダメポです。保存すらできません…。
どういう原因が考えられるでしょうか?
アドバイスお願いしますorz
0317315
2005/03/31(木) 13:11:59ID:???長くなりますがよろしくお願いします。
#マルチパートデータ解析
local($div,$id,$value,$filename,$minetype,$size);
$div = <STDIN>;
$div =~ s/\s+$//;
$line = '';
until($line =~ /^$div--/){
$id = '';
$value = '';
$filename = '';
$minetype = '';
$line = <STDIN>;
until($line =~ /^\s*$/){
return if eof(STDIN);
if($line =~ /\sname="([^"]*)"/i){$id = $1;}
if($line =~ /\sfilename="([^"]*)"/i){$filename = &trim($1);}
if($line =~ /^Content-Type:\s+(\s+)/i){$minetype = $1;}
$line = <STDIN>;
}
$size = 0;
$maxbyte = 1024*500;
$line = <STDIN>;
until($line =~ /^$div/){
return if eof(STDIN);
$size += length($line);
$value .= $line if ($size < $maxbyte);
$line = <STDIN>;
}
0318315
2005/03/31(木) 13:12:59ID:JNShQA97$param{$id} = $value;
$paramtype{$id} = $minetype if($minetype ne '');
}else{
$param{$id} = '';
$paramtype{$id} = 'big';
}
$paramfile{$id} = $filename if ($filename ne '');
}
#ファイル保存
$oname = &trim($paramfile{"file"});
&jcode'convert(*oname,'euc');
$oname =~ s/\\/\//g;
$oname = substr($oname,rindex($oname,"/")+1);
$type = $paramtype{"file"};
$bindat = $param{"file"};
if($type eq 'big'){&err;}
if($bindat =~ /^\s*$/){ $chk='ok';}
elsif($bindat =~ /^GIF\d\d[a-z]/) { $chk='ok'; }
elsif($bindat =~ /^\xFF\xD8\xFF\xE0\x00/) { $chk='ok'; }
elsif($bindat =~ /^\x89\x50\x4E\x47\x0D\x0A\x1A\x0A/) { $chk='ok'; }
elsif($type =~ /image\/gif/i){ $chk='ok'; }
elsif($type =~ /image\/jpeg/i){ $chk='ok'; }
elsif($type =~ /image\/x-png/i){ $chk='ok'; }
else{ $chk='no'; }
if($chk ne 'ok'){ &err;}
$fullpath = "$imgdir$oname";
if(-f "$fullpath"){&err;}
0319315
2005/03/31(木) 13:13:24ID:???unless(open(FILE, ">$fullpath")){&err;}
binmode(FILE);
print FILE $bindat;
close(FILE);
chmod (0666,$fullpath);
use Image::Magick;
$osize = Image::Magick->new();
$osize->Read($fullpath);
($w,$h) = $osize ->Get('width','height');
##以下略
}
ageてしまったごめんなさい。
0320315
2005/03/31(木) 13:17:16ID:???化け部分はエラー用のサブルーチンに跳ばしてます。
0321nobodyさん
2005/03/31(木) 13:28:14ID:???0322315
2005/03/31(木) 14:02:42ID:???レスありがとうございます。
サーバ側では特にエラーは出ていないようです。
use Image::Magick;しなければちゃんと動くんですが、
↑があるとファイル保存以下をスッ飛ばしてスクリプトの
最初の行に戻ってしまうような感じです。
アップロードしたのが軽いファイルなら最後まで正常に動きます。
どこが悪いのか自分ではさっぱり…。
0323nobodyさん
2005/03/31(木) 15:52:09ID:???CGI.pm使った方が楽だと思うのだが...
使おうとしたが何か問題があってどうしても使えないとか、
CGIの解釈を自分でやる練習ならしょうがないけど。
0324315
2005/03/31(木) 21:35:58ID:???CGI.pmを使った時、パラメータ名の指定に
for($i=0; $i < $datlist; $i++){
$hoge = $query->param("file_$i");
}
という感じに変数で指定ってできるんでしょうか?
これやると上手くいかなかったもので…。
0325315
2005/03/31(木) 23:39:26ID:???CGI.pmだと好感触みたいなのでこれでもう少し頑張ってみます。
ありがとうございました >323
0326nobodyさん
2005/03/31(木) 23:56:49ID:???これ見てファクトリパターンかっこええなぁと思ったので、ちょっとやってみるかと思ったんですが、
> return "Message::".$classname->new(%{$arg_ref});
ってことは "Message::".$classname なクラスを事前に読み込ませておかないといけないんですよね?
まさか文頭に「読み込まれる可能性のあるクラスを全部書いておく」なんてことはないんでしょうが、
直前で use "Message::".$classname; とかやっても平気なんでしょうか?
0327nobodyさん
2005/04/01(金) 00:04:45ID:???>まさか文頭に「読み込まれる可能性のあるクラスを全部書いておく」なんてことはないんでしょうが、
ん? そうじゃないの? そのときどきにrequireする物なのかな? useはNGだお
0328nobodyさん
皇紀2665/04/01(金) 13:45:49ID:JJhcoQhv$_ = $hoge;
if((s/-/-/g) > 10){
print "10以上";
}else{
print "10以下";
}
0329328
皇紀2665/04/01(金) 13:47:15ID:???0331nobodyさん
皇紀2665/04/01(金) 14:44:13ID:XdlrhN9n■ このスレッドは過去ログ倉庫に格納されています