Perlコーディング初心者質問スレ Part 41
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
05/03/10 00:47:16ID:sT66OcmD【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
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:XdlrhN9n0333328
皇紀2665/04/01(金) 15:34:10ID:???途中で書き込んだ為、誤って2スレ分になってしまいました。
語尾によって気分を害されたのであれば申し訳御座いません。
また御機会があれば宜しくお願い致します。
0336nobodyさん
皇紀2665/04/01(金) 18:00:41ID:???$_ = $hoge; # ←する理由がわからん
(ふつう $_ に意識的に代入するかなぁ…?)
$count ++ while ($hoge =~ m/-/g);
とかも可能
0337nobodyさん
皇紀2665/04/01(金) 19:13:27ID:???おそらく if (($hoge =~ s/-/-/g) > 10) と書けるとは知らなかったと思われ。
0338326
皇紀2665/04/01(金) 21:21:39ID:???うお、マジすか。
DBIが似たような仕組みらしいので、ちょいと中をのぞいてみても、
どのへんでこの問題を解決しているのかサッパリです。
ソースのどの辺りで解決しているのかおわかりの方はいませんか?
0339nobodyさん
皇紀2665/04/01(金) 22:48:38ID:ybs/IKbSDBIが読み込むドライバのことを言っているのかな。
どうせuseかrequireかdoを使ってるんだろうと
あたりをつけてサーチかませばDBI.pmのサブルーチン
install_driverの中でreqireしてごにょごにょしてる
ところはすぐ見つかると思われる。
ただドライバはDBI::DBDに説明されているような構成
になってることを要求されていて一般的なモジュール
とはちといえないから、参考になるかどうかはびみょー。
0340328
皇紀2665/04/01(金) 22:53:02ID:???ありがとです。度忘れしてました。
tr/-//採用させていただきます。
use Benchmark;
$hoge = "あいうえお-かきくけこ-さしすせそ-たちつてと-なにぬねの-はひふへほ";
timethese(100000, {
sample1 => sub { if(($hoge =~ tr/-//) > 10){} },
sample2 => sub { if(($hoge =~ s/-/-/g) > 10){} },
});
Benchmark: timing 100000 iterations of sample1, sample2...
sample1: 0 wallclock secs ( 0.05 usr + 0.00 sys = 0.05 CPU) @ 2127659.57/s (n=100000)
sample2: 0 wallclock secs ( 0.22 usr + 0.00 sys = 0.22 CPU) @ 456621.00/s (n=100000)
0341nobodyさん
皇紀2665/04/02(土) 00:17:03ID:m1Urw5SAhttp://ex9.2ch.net/test/read.cgi/soccer/1112223516/
瓦斯スレ突破ゲーム
瓦斯サポの突破力をみんなで身につけよう!!
※瓦斯スレにメール欄「小鹿」本文「お疲れ様でーす」と書き込む
※5分間書き込みがなかったら「突破成功」と再書き込みで成立
※なんらしかレスがあったら失敗
※「フロント」か「朝日」の書き込みがあったら
シーチケ取り上げられるだけで済みます。
0342326
皇紀2665/04/02(土) 02:28:50ID:???仰せの通り、該当部を覗いてみると、
requireでドライバを読み込んで、
読み込まれたドライバはDynaloaderをuseして、
bootstrapで自分自身をロードしているらしい
……具体的にはワケワカメなのですが。
詰まるところ、これが動的なインポートというやつなのでしょうか?
まんまパクってやれば、いちいち「読み込まれる可能性のある(以下略」を書かなくても良いのかなぁ。
0343nobodyさん
2005/04/02(土) 13:44:50ID:BYWwUZK5環境変数の取得の仕方は分かります。
プロキシかどうかを判定すにはどうすれば良いのでしょうか?
0344nobodyさん
2005/04/02(土) 14:12:01ID:???0345nobodyさん
2005/04/02(土) 14:25:00ID:BYWwUZK5個人的には、できるだけ強力な制限にしたいのですが、
面倒くさいようでしたら、さわりだけでも教えて頂けると助かります。
ぐぐったんですけど、検索の仕方悪いのかサーバがどうのこうのってのばっかりで…。
0348nobodyさん
2005/04/02(土) 14:40:29ID:BYWwUZK5つまり、プロキシ鯖は80、8080は大抵空いているものなのですか?
0349nobodyさん
2005/04/02(土) 14:46:46ID:BYWwUZK5…ルータで弾いてるはずなのに。やばいっすかね?
0350nobodyさん
2005/04/02(土) 15:58:19ID:???$host = 'www.2ch.net'; #IPとかホスト名
$port = 80; #ポート番号
$socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => 'tcp');
if($socket){ print 'ポート空いてるお^^'; }
else{ print '空いてないお^^'; }
0352343
2005/04/02(土) 17:18:11ID:jF3LdyJOでも、初心者の僕には頭が混乱してくる話で…w
皆さんの御厚意を無駄にしないよう、ぐぐりまくって勉強します。
最後に、クレクレで申し訳ないんですが、良い勉強サイトあったら紹介して頂けますでしょうか。
皆さんのように教えられる立場になれるようがんばります。ありがとうございました。
0353nobodyさん
2005/04/02(土) 17:46:33ID:???0354343
2005/04/02(土) 19:10:20ID:jF3LdyJOところで、
sub checkProxyList
{
my $RADDR = $ENV{'REMOTE_ADDR'};
$RADDR =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/;
my $query_addr = "$4.$3.$2.$1.niku.2ch.net";
my $addr = join('.', unpack('C*', gethostbyname($query_addr)));
if ($addr eq '127.0.0.2')
{
DispError("ERROR!","公開PROXYからの投稿は受け付けていません!!(1)");
}
return 0;
}
って、勝手に使って良いんですか?
0355nobodyさん
2005/04/02(土) 21:39:07ID:???私的利用なら問題ないでしょ。多分。俺は詳しくないからわからんけど。
でも俺なら
my $req = join(".", reverse(split(/\./, $ADDR))) . ".niku.2ch.net";
my $res = join(".", unpack("C*", gethostbyname($req)));
DispError("ERROR!","公開PROXYからの投稿は受け付けていません!!(1)") if ($res eq '127.0.0.2');
とか、
if(join(".", unpack("C*", gethostbyname(join(".", reverse(split(/\./, $ADDR))) . ".niku.2ch.net"))) eq '127.0.0.2'){
DispError("ERROR!","公開PROXYからの投稿は受け付けていません!!(1)");
}
みたいに書くよ!
0356nobodyさん
2005/04/03(日) 00:25:49ID:???0357nobodyさん
2005/04/03(日) 01:52:06ID:???例えばサブルーチンcodeのリファレンスを作るとき
sub { &code('a','b') }とすると見栄え的にあまりよくないと思うので、
\&code('a','b') や \{&code('a','b')} としてみたらエラーとなりました。
何かうまい方法は無いのでしょうか。例えば次の単純なプログラムを実行したら
Not a CODE referenceと表示されます。
$ref = \&hoho(1,\&huhu('a','b'));
&$ref;
sub hoho {
&{$_[1]};
}
sub huhu {
print $_[0].$_[1];
}
0358nobodyさん
2005/04/03(日) 06:33:05ID:???そろそろオブジェクト指向にシフトする頃合かも。
あえてクロージャで書いてみる。
$ref = create_hoho(1, create_huhu('a', 'b'));
$ref->();
sub create_hoho {
my ($dummy_arg, $sub_ref) = @_;
return sub { $sub_ref->(); }
}
sub create_huhu {
my @args = @_;
return sub { print $args[0].$args[1]; }
}
0360nobodyさん
2005/04/03(日) 10:02:18ID:???# 処理
# のようなのは不可能なのですか?
# この中でディレクトリの内容を $_ に読み込んで処理したいのですが、
# 直前に処理されていた $_ の値が入ってしまいます。
}
よろしくお願いします。
0361nobodyさん
2005/04/03(日) 10:54:05ID:???}
0362nobodyさん
2005/04/03(日) 11:17:18ID:???}
■ このスレッドは過去ログ倉庫に格納されています