Perlコーディング初心者質問スレ Part 43
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/08/12(金) 01:26:47ID:mHnZWvqz【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0352nobodyさん
2005/09/09(金) 08:09:10ID:???print map "$_\n",
sort {
return $b =~ /^\d+$/ ? $a <=> $b : -1 if $a =~ /^\d+$/;
return $b !~ /^\d+$/ ? $a cmp $b : 1;
} keys %test;
>>348 のケースだと四行目は単に $a cmp $b; でもヨシだけれど、1 と -1 を交換すると逆のニーズにも対応できるという噂。
0353nobodyさん
2005/09/09(金) 11:49:05ID:???半日っていうともう猶予は過ぎてるかも知れないけど、>>338は
Perl始めたばかりのド素人のようだから無視するように。
mod_perlを使っていないのなら下の案はwgetを子プロセスとして起動する分、
サーバー負荷は無条件に高い。
単純計算で1アクセスにつき無条件にperlとwgetで計2プロセスが起動される
ことになる。wgetの中で上のコードと同じようなことをやっているのだから、
上の案のほうが負荷は半分になると考えていいだろう。
しかしそんなにアクセス数が見込まれるサイトがHTTP経由でデータ取得を行う
なんていうアホな設計になっているところが信じられん。
0354348
2005/09/09(金) 11:50:39ID:???本当に有難うございます。
とりあえず一旦
foreach my $key (sort k::sort_rule keys %$refs) {
print $key;
}
sub sort_rule{
return $b =~ /^\d+$/ ? $a <=> $b : -1 if $a =~ /^\d+$/;
return $b !~ /^\d+$/ ? $a cmp $b : 1;
}
こんな感じで後で試してみようかと思います。
結果は追ってご連絡いたします。
0355nobodyさん
2005/09/09(金) 12:06:18ID:???有難うございます。
あれから実はソケット通信をやってみたのですが、エラーが出てしまったんです。
Object not found!
The requested URL was not found on this server.
If you entered the URL manually please check your
spelling and try again.
If you think this is a server error, please contact
the <a href="mailto:webmaster@localhost">webmaster</a>.
Error 404
localhost.localdomain
それで偉い人に聞いてみたら、「uname -nで分かるノード名を使って通信して、
2台のサーバのファイルの同期を取れ」とか言われたのですが、これがさっぱり
わからず、もうどうにでもなれといった感じでオープンが近づいております。。
ノードを名取った後どのような処理をすればよいのか、もしもご存知のようでしたら
ご教示いただきたく思っております。
0356nobodyさん
2005/09/09(金) 15:06:48ID:???なんか予想の斜め上をいく展開だな。
とりあえずその偉い人に
同一セグメントのサーバ同士のファイルの同期をとるのが目的なら
いっそのことNFSかsambaかWebDAVでディレクトリを共有したらどうですか?
と進言してみたら?
リアルタイム性を要求されないのならrsyncとかも使える。
0358nobodyさん
2005/09/09(金) 17:56:17ID:???数じゃない文字列を <=> で比較すると use warnings 下では
Argument 〜 isn't numeric in numeric comparison (<=>) at 〜
が出ることをいってるんじゃないだろうか。
0359nobodyさん
2005/09/09(金) 18:18:45ID:???NFS等の導入は一番初めに提案させていただきましたが、
上から許可がおりないとか何とかであっさり却下されました。。
もうどうしたらよいのやら。。
0361nobodyさん
2005/09/09(金) 20:40:27ID:???プロジェクト全体が腐ってるっぽいな。
404になる件はノード名を/etc/hostsに登録すれば
なんとかなるだろうが…
0362nobodyさん
2005/09/10(土) 10:54:03ID:???ヘッポコ上司に連座させられたくなかったら、
ちゃんとしたプロマネつれてこないとポシャルと、
上司を飛び越してその上の上司に進言しなさい。
>>361
> 404になる件はノード名を/etc/hostsに登録すれば
> なんとかなるだろうが…
ならない。
0363nobodyさん
2005/09/10(土) 11:15:29ID:???open(LOG,"$logfile");
$count += tr/\n// while(read LOG, $_, 1024);
close(LOG);
どうしてこれで$logfileの長さをカウントできるのか教えてください。
3行目のtr/\n// while(read LOG, $_, 1024);がよく分かりません。
0364nobodyさん
2005/09/10(土) 11:15:52ID:???0365nobodyさん
2005/09/10(土) 11:19:09ID:???ファイルのサイズではなく、行数をカウントしてるのでは。
ちなみに
open(LOG, $logfile);
の方が良いと思います。余計な変数展開がなくなります。
0366363
2005/09/10(土) 11:22:57ID:???行数でした。
C言語しか知らないもので、while(条件){実行する内容}
という形式は理解できるのですが、perlではwhile文はどのように展開されるのでしょうか?
0367nobodyさん
2005/09/10(土) 11:34:44ID:???while を後置しているだけです。スクリプティング言語では多く見られます。
以下と同じ意味です。
while (read(LOG, $_, 1024)) {
$count+= tr/\n//; # trは置換に成功した数を返す。
}
0371nobodyさん
2005/09/10(土) 15:15:07ID:???0372名無しさん@そうだ選挙に行こう
2005/09/11(日) 16:20:19ID:yhvSpEP/サーバー1: Fedora Core release 3, Kernel 2.6.9-1.667, Perl version 5.8.5
サーバー2: FreeBSD 5.4-STABLE, Perl v5.8.2
どうすればよろしいでしょうか?
sub SHA {
### &SHA("squeamish ossifrage\n");
### Should return 82055066 4cf29679 2b38d164 7a4d8c0e 1966af57
local ($temp, $m, @A, @K, $x, $n);
local ($b, $c, $d, $e, $S, $r, @W, $t, $v);
my ($msg, $p, $l) = @_; #$p=0; $l=0
my $inputp=$_[0];
local $_;
$temp = 'D9T4C`>_-JXF8NMS^$#)4=L/2X?!:@GF9;MGKH8\;O-S*8L\'6';
$m = 4294967296;
###$m=1+~0;
@A=unpack"N*",unpack "u",$temp;
@K=splice@A,5,4;
sub M{($x=pop)-($m)*int$x/$m};
sub L{$n=pop;($x=pop)<<$n|2**$n-1&$x>>32-$n}
@F=(sub{$b&($c^$d)^$d},$S=sub{$b^$c^$d},sub{($b|$c)&$d|$b&$c},$S);
do{
$msg=~s/.{0,64}//s;$_=$&;
$l+=$r=length;
$r++,$_.="\x80"if$r<64&&!$p++;@W=unpack N16,$_."\0"x7;$W[15]=$l*8
if$r<57; for(16..79){push@W,L$W[$_
-3]^$W[$_-8]^$W[$_-14]^$W[$_-16],1}($a,$b,$c,$d,$e)=@A;
for(0..79){$t=M&{$F[$_/ 20]}+$e+$W[$_]+$K[$_/20]+L$a,5; $e=$d; $d=$c;
$c=L$b,30; $b=$a; $a=$t}$v='a'; @A=map{ M$_+${$v++}}@A
}while$r>56;
return sprintf'%8x'x4 . '%8x',@A;
}
0373348
2005/09/11(日) 16:54:25ID:???foreach my $key (sort k::sort_rule keys %$refs) {
print $key;
}
sub sort_rule{
return $b =~ /^\d+$/ ? $a <=> $b : -1 if $a =~ /^\d+$/;
return $b !~ /^\d+$/ ? $a cmp $b : 1;
}
これでいきました!本当に有難うございました!
まだまだ技術レベルが低いので意味がわかってないのですが、
これから勉強してこの構文を十分理解できるようになりたいと
思います。
ご教示、誠に有難うございました。
0374名無しさん@そうだ選挙に行こう
2005/09/11(日) 23:02:31ID:moSzhZBr説明を読むと、デフォルトの変数として、省略されている場合も
自動的に代入や出力されている特殊変数とあるのですが、たとえば
if ($_[0] eq 'bye') {
いきなりこんなのが出てきた場合、一体何をしてるんでしょうか。
自動的に配列を作って、0に何かが代入されている?
うかがうのに妥当なスレがないようだったので、こちらで尋ねました
よろしくお願いします。
0375名無しさん@そうだ選挙に行こう
2005/09/11(日) 23:05:32ID:???サブルーチンの第一引数とか
0376名無しさん@そうだ選挙に行こう
2005/09/11(日) 23:07:43ID:???0377名無しさん@そうだ選挙に行こう
2005/09/11(日) 23:12:45ID:???@hoge = (1 ,2, 3);
↓
$hoge[0] == 1
@_ = (1 ,2, 3);
↓
$_[0] == 1
ok?
0378374
2005/09/11(日) 23:22:07ID:???レスありがとうございます。
>377の例、わかりやすかったです
特に個別に名前はつけてないけどこーゆー配列(変数)だよ、っていう事なんでしょうか。
もしかしてすごくアホな事聞いてるかもしれないんですが、さっきの
if ($_[0] eq 'bye')
コレ、いきなり出てきたんです。>377で言う@_ = (1 ,2, 3); みたいなのがなくて。
@_ = (1 ,2, 3); がないのに、一体何と比較してるんだろう???となってしまったんですが…
0379名無しさん@そうだ選挙に行こう
2005/09/11(日) 23:29:33ID:???サブルーチンの引数は、勝手に @_ に入ります。
というか、基本なんだからマニュアルか、本を読もうよ…。
0380374
2005/09/11(日) 23:37:29ID:???すみません。実は本読んでもよくわかりませんでした。
もうちょいスクリプトいじってみて、悩んでみます…
0381名無しさん@そうだ選挙に行こう
2005/09/11(日) 23:41:56ID:???その本、巻末に索引付いてませんか?
そこで、$_ と @_ を探しましょう。
0382nobodyさん
2005/09/12(月) 17:57:25ID:???-----
$classname = 'bar'
return "foo::".$classname->new();
-----
みたいに、変数に入ってる値でクラスを呼び出すことはできないのでしょうか?
(この例だと、foo::barを呼び出したいです)
foo::??の??の部分を変数にして動的に変えたいですが、何かやり方はありますか?
0383nobodyさん
2005/09/12(月) 18:25:32ID:???0384nobodyさん
2005/09/12(月) 20:53:06ID:???use strict; を使ってるなら
no strict 'refs';
使ってないなら
$a = 'aaa';
&{$a."::new"}();
0385nobodyさん
2005/09/12(月) 20:54:01ID:???use strict; を使ってるなら
no strict 'refs';
$a = 'aaa';
&{$a."::new"}();
使ってないなら
$a = 'aaa';
&{$a."::new"}();
0386nobodyさん
2005/09/12(月) 20:56:53ID:???$obj = "foo::$classname"->new();
もできるんじゃないかな。
0388nobodyさん
2005/09/12(月) 22:46:32ID:Giee4nr4print table(TR,(td("")));
この書き方だとエラーになるようなんですが
0390nobodyさん
2005/09/13(火) 11:31:37ID:???ファイルを開いて処理する時に
open (FILE,"<$list");
while(<FILE>){
chomp;
my (undef,$addr,$svr,$uer,$pass) = split(/<>/,$_);
&get($addr,$svr,$usr,$pass);
}
close FILE;
と、
open (FILE,"<$list");
my @getlist = <FILE>;
close FILE;
foreach my $usrdata(@getlist){
chomp($usrdata);
my (undef,$addr,$svr,$uer,$pass) = split(/<>/,$usrdata);
&get($addr,$svr,$usr,$pass);
}
ってどちらが速いいですか?
会社の人は「whileよりforeachのほうが速い」って言うのですが、
何回ベンチ取ってもwhileのほうが1割近く速くなるんです。
私のベンチの取り方が問題?
読み込むファイルの大きさは1kb程度のものです。
0391nobodyさん
2005/09/13(火) 12:15:30ID:???その例ならwhileの方が普通は早そうでベンチとも一致する。
my @getlist = <FILE>;
でファイル全体を一行ずつにばらした配列を作るのが余計な
手間になるからね。
ただ一般的には往々にして直観はあてにならないのできちんと
ベンチをとって評価するのが正道。
0392nobodyさん
2005/09/13(火) 12:28:09ID:???0393nobodyさん
2005/09/13(火) 14:15:39ID:???0394382
2005/09/13(火) 14:15:41ID:???386さん
うまくいきました。ありがとうございました。
0396nobodyさん
2005/09/13(火) 20:13:08ID:???掲示板CGIなどで、特定の投稿を編集をするとき、一括読み込みをしないでデータを書き換える方法はありますか?
0397nobodyさん
2005/09/13(火) 21:19:34ID:???0399390
2005/09/14(水) 00:52:53ID:???>>393
ありがとうございます。
会社の人が言うように、whileよりforeachのほうが速いケースってあるんだろうか・・・
と思う今日この頃。
0401nobodyさん
2005/09/14(水) 23:20:56ID:???use CGI;
use Image::Magick;
$cgi = new CGI;
$fh = $cgi->param('picFile');
$i = new Image::Magick;
$i->Read($fh); #これができない
print "Content-type: image/jpeg¥n¥n";
$i->Write('jpeg:-'); #何も出力されない
フォームで選択されたファイルをどうにかしてファイルハンドルとして
PerlMagickに読み込ませたいのですが、うまく行きません。
現在は標準入力のデータを一旦ファイルに書き出し、
それを読み込んで加工する方法を取っておりますが、明らかに非効率だと思うのです。
いい方法はございませんでしょうか。
0402nobodyさん
2005/09/14(水) 23:24:25ID:???0403401
2005/09/14(水) 23:57:54ID:???$fhはファイルハンドルじゃないってことですか?
でも
read($fh, $buf, 1024);
という風にできるから・・・
0404nobodyさん
2005/09/15(木) 01:10:00ID:???PerlMagickと組み合わせて使ったことはないのでよくわからんが、
ファイルハンドルがほしいのなら
$fh = $cgi->upload('picFile');
を使う方がいいんじゃないかと。(ただしCGIモジュール2.47以降)
詳しくはCGIモジュールのPODの「CREATING A FILE UPLOAD FIELD」を
をよく読むといいだろう。
0405nobodyさん
2005/09/15(木) 13:41:48ID:3HNHstcis/ba/ば/g;
s/bi/び/g;・・・・みたいに何十行もえんえん続けるようなのでなく、
もっと効率的に動いて効率的に書けるような方法ありますか?
0406nobodyさん
2005/09/15(木) 14:12:50ID:???そおんなもんとっくに誰かが作ってるだろうと思い検索したらあったよ
ttp://pitecan.com/OpenPOBox/romakana/
0407401
2005/09/15(木) 15:53:13ID:???uploadとは盲点でした。が、状況は変わらず・・・。
ファイルハンドルを渡す時は
$i->Read(¥*fh);
とするとリファレンスあったので、これも試してみました。
PerlMagickにこだわるあまりCGIの方が疎かになっているようなので、
色々可能性を模索したいと思います。
0409401
2005/09/15(木) 17:18:27ID:???あ、ほんとだ。リファレンスにも書いてあるし、何故見落としてたんだろう・・・orz
おかげさまでうまく行きました。ありがとうございました。
0410nobodyさん
2005/09/16(金) 08:23:19ID:0dogEF/n本当に申し訳ないです
知らない方がいらっしゃるのであれば申し訳ないのですがネットゲーム「罪と罰」のようなCGIを利用し、
複数のプレーヤーの様々な数値(ステータスなど)を参加者全体で共有するどういった内容で行なわれているのでしょうか?
ついでにもう一つの質問を。スレ違いな感はありますがどうか答えてやってください。
PerlとPHPが多くのCGIで利用されているようですが二種類の言語が存在するということは各々に得手不得手があるということですよね?
その得手不得手及び私が制作しようとしているCGIゲームではどちらが向いているのか、初心者ではどちらが学びやすいか教えてもらえるとかなり光栄です。
よろしくお願いします。
自分の質問…あまりにも馬鹿なのか基本的すぎるのか検索にすらHitしないんです…orz
0411nobodyさん
2005/09/16(金) 08:31:10ID:???もう少しちゃんと調べような。
http://www24.big.or.jp/~obo/game/ore_/gild/
これはPerlで書かれてる模様。
2つ目の質問はスレ違いだが、これ以上他のスレに誤爆されても困るので答えておく。
まずCGIと言う形では向いていない。
罪と罰もそうだけど、このタイプの設置を禁止している鯖も多い。
そしてCGIにはRubyやPython、JAVAもあればCもある。
要約するとこうだ、半年ROMってろ。
0412nobodyさん
2005/09/16(金) 08:32:08ID:???半日ROMってくる
0413nobodyさん
2005/09/16(金) 09:32:49ID:???う〜ん…
自分は船乗りなので海の上でできる趣味が無いかな?と思ったんですけどねぇ…。
本で勉強してからまた書き込みます。まずは罪と罰と同じPerlから購入してみようと思います。
オススメの書籍があるならばお教えください。
レス無くとも言われたとおりROMっているので気を悪くしないでください。
0414413
2005/09/16(金) 10:03:47ID:???私に出てきてほしい場合は(限りなくそんな場合無いとは思いますが…)乗船期間以外であれば「あの時のゲームCGI初心者」や「誤爆犯」など分かりやすく呼んでいただけると出てきます。
おそらく自分から出てくるのは仕事もあるので4ヵ月〜半年後になると思います。
0415nobodyさん
2005/09/16(金) 11:06:01ID:???次の質問ドゾー
0416nobodyさん
2005/09/16(金) 11:44:27ID:???>>410
まあ初心者的には php のが楽かもね、と。
0417413
2005/09/16(金) 21:00:27ID:???>>416さん
レスありがとうございます。
PHPですか。HTMLと一緒に記述できる点が初心者向きということですか?
本屋でPerl関連の本を探してもあまり見つからない(一冊しか無かった…)のは何故でしょう?
素人調べで悪いのですがUNIXと記述方法が似ていると言う事なのでUNIXを学べば良いのでしょうか?
でもUNIXってかなりレベルが高いような…
0418nobodyさん
2005/09/16(金) 21:05:55ID:???>本屋でPerl関連の本を探してもあまり見つからない(一冊しか無かった…)のは何故でしょう?
これはありえないと思われます。事実ならその本屋・・・品揃え悪すぎだと・・・
0420nobodyさん
2005/09/16(金) 21:30:04ID:???0422nobodyさん
2005/09/17(土) 00:01:30ID:???>>417
php は関数が最初から腐るほど用意されてあるから、
perl みたいに自分で書いたりモジュール用意したりする手間が省けることが多いのだよ。
そこが perl の楽しいところでもあるんだけど、初心者には荷が重いかもとか。
結構Web上でも初心者から学べる解説サイトがいくつかいくらでもあるので、そういうの見てもいいかもね。
まあ、ここは perl コーティングの質問スレだから、これ以上はここではきかないでね。
0423nobodyさん
2005/09/17(土) 00:24:53ID:???そう?妄想なら日記に書いておいてよ。
0425nobodyさん
2005/09/17(土) 04:40:43ID:???$funcs = get_defined_functions();
print count($funcs["internal"]);
?>
このスクリプトで組み込み関数の数を調べられるわけだが
うちの環境(PHP4.4.0+mb_string)では
826という数字が出て来た。
0426nobodyさん
2005/09/17(土) 07:33:55ID:???php5.1.0b2
1084
腐るほどかどうかは不明だが妄想とはいえないだろ
0427nobodyさん
2005/09/17(土) 07:58:14ID:???数えるのマンドクセ('A`)
0428nobodyさん
2005/09/17(土) 08:32:46ID:???こんな関数がある時点ですでに腐っている。
0429nobodyさん
2005/09/17(土) 09:10:30ID:???0430nobodyさん
2005/09/17(土) 10:05:17ID:???0433nobodyさん
2005/09/17(土) 15:15:36ID:???また、組み込み関数とやらにバグがあった場合、root 等の権限を
持たないユーザでは何も出来なくなるけど、そういう場合どうするの?
0434nobodyさん
2005/09/17(土) 15:35:59ID:9NJ0Gho0キーを抜き出したいのですが、これは無理なんでしょうか?
%hoge = ('aaa', 3, 'ccc', 2, 'bbb', 1);
foreach(%hoge){
print "$_ ";
}
欲しい結果
aaa 3 ccc 2 bbb 1
0435nobodyさん
2005/09/17(土) 15:43:14ID:ceziuPlebiglobeでMIME::BASE64使うにはどうしたらいいの?
0436nobodyさん
2005/09/17(土) 16:07:42ID:Oc8EoCio無理じゃない?キーの頭に値を入れてソートするとか
0438nobodyさん
2005/09/17(土) 16:41:27ID:???それができるモジュールがあったと思う。
モジュール名は失念。
>>435
MIME::BASE64 を cpan あたりからダウンロードして biglobe の自分の
ディレクトリに置き、
use lib qw(path/to/MIME::BASE64);
でOK。
0439nobodyさん
2005/09/17(土) 16:44:02ID:???use Tie::Hash::Array;
tie my %hoge, 'Tie::Hash::Array';
%hoge = ('aaa', 3, 'ccc', 2, 'bbb', 1);
foreach(%hoge){
print "$_ ";
}
0440nobodyさん
2005/09/17(土) 16:44:52ID:???> MIME::BASE64 を cpan あたりからダウンロードして biglobe の自分の
http://search.cpan.org/src/GAAS/MIME-Base64-3.05/
xs とかあるけど、どーやってコンパイルするんだろう。
0441439
2005/09/17(土) 16:45:43ID:???0444nobodyさん
2005/09/17(土) 17:04:08ID:???>>434 がどうして >>434 なような意味不明なことを考えたかだ。
@unko = ('aaa', 3, 'ccc', 2, 'bbb', 1);
foreach (@hoge){
print "$_ ";
}
0445nobodyさん
2005/09/17(土) 17:08:38ID:???pure perl 版はどうでしょう?
http://search.cpan.org/~gaas/MIME-Base64-Perl-1.00/lib/MIME/Base64/Perl.pm
0447nobodyさん
2005/09/17(土) 17:14:41ID:???へー。pure perl なのあったんでつね。
>>446
がんばってコンパイラの使い方を説明してあげてくれ。w
0448439
2005/09/17(土) 17:15:38ID:???use Tie::Hash::Indexed;
tie my %hoge, 'Tie::Hash::Indexed';
%hoge = ('aaa', 3, 'ccc', 2, 'bbb', 1);
foreach(%hoge){
print "$_ ";
}
# 一応できたけど、このモジュールだったけか…。
0449nobodyさん
2005/09/17(土) 17:19:12ID:???0451nobodyさん
2005/09/17(土) 17:55:00ID:9NJ0Gho0どうもありがとうございます。
用途は、、確かに配列でも代用できそうなんですけど、
キー指定して、値を引っ張るて事をしたく、
たまに、決まった順番でまとめて出力したかったからです。
■ このスレッドは過去ログ倉庫に格納されています