トップページphp
1001コメント349KB

Perl 初心者コーナー Part22

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/04/15 10:15ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。


CGIだけど、なんか質問ある? Part 10
http://pc2.2ch.net/test/read.cgi/php/1048686475/
参考書籍の話題は、【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/

過去ログやお勧めサイトは >>2-10
0002nobodyさん03/04/15 10:15ID:???
[過去ログ]
Part1 http://tako.2ch.net/test/read.cgi?bbs=perl&key=957208980 参照不能
 DAT: http://tako.2ch.net/perl/dat/957208980.dat
Part2 http://tako.2ch.net/test/read.cgi?bbs=perl&key=971817087 参照不能
 DAT: http://tako.2ch.net/perl/dat/971817087.dat
Part3 http://tako.2ch.net/test/read.cgi?bbs=perl&key=979894521 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part4 http://tako.2ch.net/test/read.cgi?bbs=perl&key=984430156 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part5 http://pc.2ch.net/php/kako/988/988728069.html
Part6 http://pc.2ch.net/php/kako/996/996075607.html
Part7 http://pc.2ch.net/php/kako/1000/10002/1000267444.html
Part8 http://pc.2ch.net/php/kako/1003/10039/1003900311.html
Part9 http://pc.2ch.net/php/kako/1009/10095/1009549309.html
Part10 http://pc.2ch.net/php/kako/1014/10145/1014556702.html
Part11 http://pc.2ch.net/php/kako/1017/10172/1017201229.html
Part12 http://pc.2ch.net/php/kako/1019/10199/1019917048.html
Part13 http://pc.2ch.net/php/kako/1022/10227/1022731565.html
Part14 http://pc.2ch.net/php/kako/1026/10269/1026977659.html
Part15 http://pc.2ch.net/php/kako/1028/10288/1028816385.html
Part16 http://pc.2ch.net/php/kako/1032/10320/1032070299.html
part17 http://pc.2ch.net/php/kako/1034/10345/1034583844.html
part18 http://pc.2ch.net/php/kako/1037/10377/1037797479.html
part19 http://pc.2ch.net/php/kako/1042/10422/1042260745.html
part20 http://pc2.2ch.net/test/read.cgi/php/1044717887/ (タイトルに19と誤記)

[ひまぢん氏のミラー]
Part1 http://www.angelfire.com/ak5/2ch-web-program/kako/957208980.html
Part2 http://www.angelfire.com/ak5/2ch-web-program/kako/971817087.html
Part3 http://www.angelfire.com/ak5/2ch-web-program/kako/979894521.html
Part4 http://www.angelfire.com/ak5/2ch-web-program/kako/984430156.html
Part5 http://www.angelfire.com/ak5/2ch-web-program/kako/988728069.html
0003nobodyさん03/04/15 10:16ID:???
[総合]
 ・Perl Com: http://www.perl.com/pub/
 ・CPAN.com: http://search.cpan.org/
 ・ActivePerl: http://www.activestate.com/
 ・CGI-ML:http://forest.ne.jp/cgi-ml/

[お薦め]
 ・Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm ★読んどけ
 ・Perl Recipes: http://www.effectiveperl.com/recipes/
 ・Randal's WebTechniques columns: http://www.stonehenge.com/merlyn/WebTechniques/
 ・Perlの部屋: http://www.cc.rim.or.jp/~midorin/mad-p/perl/index.html
 ・Perl初心者の部屋:http://www.harukaze.net/~mishima/perl/
 ・Perlリファレンス:http://www.big.or.jp/~mio/ga/pl/plref/pl_ref.htm
 ・Perlのページ:http://homepage1.nifty.com/nomenclator/perl/
0004nobodyさん03/04/15 10:16ID:???
[Document&Tutorial]
 ・Perl News: http://www.news.perl.org/
 ・Perl Monks: http://www.perlmonks.org/
 ・use Perl; : http://use.perl.org/
 ・Learn Perl - Perl Education: http://www.devdaily.com/perl/edu/index.shtml
 ・Perldoc.com: http://www.perldoc.com/
 ・Using Perl5 in Web: http://docs.rinet.ru/Using_Perl5_in_Web/
 ・Rex Swain's Home Page: http://www.rexswain.com/
 ・Robert's Perl Tutorial: http://www.netcat.co.uk/rob/perl/win32perltut.html
 ・Perl Tuts: http://savage.net.au/Perl-tutorials.html
 ・Beginning Perl Tutorials: http://www.pageresource.com/cgirec/index2.htm
 ・jcode.pl の私的な解説書: http://www.mikeneko.ne.jp/~lab/kcode/jcode.html
 ・Logical Choice Software, Home Page: http://www.logsoft.com/perltips/
 ・Perlfect Solutions: http://perlfect.com/
 ・The Perl Archive : http://www.perlarchive.com/
 ・Perl6 & Parrot VM についての情報: http://dev.perl.org/perl6/
 ・use Object; : http://perl.infoware.ne.jp/
0005nobodyさん03/04/15 10:36ID:???
前スレ

Perl 初心者コーナー Part21
http://pc2.2ch.net/test/read.cgi/php/1047980851/
0006nobodyさん03/04/15 10:37ID:???
>>5
テンプレのほうに足すの忘れてしまった。スマン
0007nobodyさん03/04/15 15:12ID:wdeZFKcA
前スレの最後の方の質問者ですが、
あの環境変数のスクリプト動きました。
どうやら仕様(?)変わったらしく、以前はcgi-binに入れなくてよかったんですが、
入れないといけなくなったらしいです。
それで、また質問なんですが、指定した環境変数だけ表示するにはどうすればいいんですか?
よろしくお願いします。
0008nobodyさん03/04/15 15:18ID:???
>7
表示したい環境変数を指定する。
0009nobodyさん03/04/15 16:02ID:F/iCEAMk
このスレで聞くことじゃないかもしれないんですが・・・
私はサーバを借りてて、(Kagoyaのスタンダード40です)
サイトにPerlでランダムに文面を表示するスクリプトを設置してました。
20個くらいページがあって1ページにつき4つほどそのスクリプトを
設置してたところ、サーバに負荷がかかりすぎだと
サポートの人から注意されてしまいました。
Perlで書いたCGIを使うとそんなに負荷ってかかるもんなんでしょうか?
まあ1ページに4つも設置した私が一番馬鹿だとは思うのですが。
0010nobodyさん03/04/15 16:10ID:???
>>9
まーどんなスクリプトかしらんから答えようが無い。
一般的にはそれなりに負荷はかけるものだと思ったほうがいいよ。

# というかランダム文字列とかはサーバーサイドでやるよりクライアントサイドでやったほうがいいんじゃ?
0011nobodyさん03/04/15 16:11ID:???
>>9
どのぐらいアクセスあるかもわからないので、なんとも言えないね。
ランダムな文面がそんなに各ページに必要な理由もわからないし。
0012nobodyさん03/04/15 16:36ID:F/iCEAMk
>>10-11さん
そうですか。私が設置してたのは携帯用サイトのランダムテキスト広告です。
長いので引用はやめときますが、こういう広告ってやっぱり
スクリプトの文章の長さによって負荷の大きさって違うんでしょうか?
今度から以下のようなランダム表示スクリプトを使おうかと思うんですが。
#!/usr/local/bin/perl5
$txtfile = "ranod,.txt";
open(FILE, "$txtfile");
chop(@lines = <FILE>);
close(FILE);
srand(time + $$);
$aaa = int(rand($#lines + 1));
print $lines[$aaa];
exit;

あと、クライアントサイドっていうのもあるんですね。
今の私にはさっぱりわかりませんが勉強しようっと。
0013nobodyさん03/04/15 16:38ID:???
あ・・・なんかファイル名のとこが変ですいません
0014nobodyさん03/04/15 16:40ID:???
携帯端末だとJavaScriptは使えないから、サーバサイドで任意のメッセージを
吐き出すように、なおかつメモリを食い過ぎないようにするしかない。
0015nobodyさん03/04/15 17:34ID:???
>>9-12
Perlの話じゃなくなってるが、
そのスクリプトがSSIで埋め込まれてるとして…。

今時のサーバだとスクリプト自体の処理内容より、
プロセス立ち上げが大きな負荷になる。
だから1ページ表示する度に4つのプロセスが
立ち上がるような事をするより、ページ丸々CGIで
吐くようにした方がサーバには優しいと思う。

http://pc2.2ch.net/test/read.cgi/php/1048686475/
0016nobodyさん03/04/15 17:41ID:???
これを4つずつ使ってりゃ注意も来るかもな。
1つで4つ分の広告をまとめて吐くようにすればいいのに。
0017nobodyさん03/04/15 17:50ID:???
どうもです。まとめてCGIとして作ったほうが良いんですね。
そっちのほうが負荷が大きいものだと思ってました。
調べてやってみたいと思います。ありがとうございましたー。
0018nobodyさん03/04/15 18:25ID:0B+FeJbY
配列について躓いています。
・やりたいこと
 24bitsカラーコードを、無作為に選んで並び替えたい。
・やってみたこと。
 24bits分の配列を用意して、無作為に選び、別の配列へ代入させてみた。
my @src_colors=(0..16777215);
my @dist_colors;
foreach(0..16777215){
push(@dist_colors,splice(@src_colors,int(rand($#src_colors+1)),1));
}
・結果
 Out of memoryとなる。

そもそも64MBytesもある配列を用意している時点でアウトなんだと思うのですが、ほかに良い方法が思い浮かびませんでした。
(外部ファイルを使って同じ方法を。と思ってみたのですが、こちらも「重複するカラーコードを排除する」という点で同じような配列を使ったためにOut of memoryとなってしまいました。)
そこで、別の方法論がありましたらご教授いただけるとありがたいです。
それではよろしくおねがいいたします。
0019Perl3級03/04/15 18:40ID:bx4RfdeG
一週間がんばりましたが、どうしてもわかりません。
最後の望みを託してエキスパートのみなさんにすがります。宜しくお願い
致します。

#/usr/local/bin/perl
@i = ( "AAA 100 80",
"BBB 500 500",
"AAA 400 420");

foreach $line (@i) {
split(/\s/, $line);
$key = $_[0];
$hash{$key} = $line;
print "$key $hash{$key}\n";
}

これを実行すると、

AAA => AAA 100 80
BBB => BBB 500 500
AAA => AAA 400 420

となります。あとは、AAA,BBBごとに右の数字を足していきたいのです。
簡単に言えば集計プログラムです。最終的に

AAA => AAA 500 500
BBB => BBB 500 500

となれば成功です。どんなにやってもわかりません。頭も痛くなって
きました。ぼくに秘伝を伝授して下さい。どうか、お願いします。
0020nobodyさん03/04/15 18:43ID:???
>>18
並べ替えできたとして何に利用するの?
九九の範囲内で足りるものを、それ以上の桁数で答を
用意しておいても無駄なだけでしょ
用途に対する根本的な設計がうまくないのでは?
0021通行人さん@無名タレント03/04/15 19:14ID:???
my @i = ( "AAA 100 80",
"BBB 500 500",
"AAA 400 420",
"AAA 120 150",
"BBB 30 420"
);

my %hash = ();
foreach my $line (@i) {
my @temp = split(/\s/, $line);
my $key = shift @temp;
if( exists $hash{ $key }){
$hash{ $key }->[ 0 ] += $temp[ 0 ];
$hash{ $key }->[ 1 ] += $temp[ 1 ];
} else {
$hash{$key} = [ @temp ];
}
}
foreach my $key(keys %hash){
print $key, $hash{$key}->[ 0 ],$hash{$key}->[ 1 ], "\n";
}
0022nobodyさん03/04/15 19:23ID:???
この場合、exists は definedにするべき。undefに加算することを避けていることをはっきりさせる。
それから、my @tempで新しいメモリに置いてるのに、[ @temp ]は勿体ない。
0023nobodyさん03/04/15 19:26ID:???
undefをdereference
00242103/04/15 19:28ID:???
>>22
そうですね。
ありがとうございます。
0025nobodyさん03/04/15 19:44ID:???
>>21-22
この場合は暗黙の内に生成しちまっても問題ないと思うんだけど
駄目なんでしょうか。

@record = ("AAA 100 80", "BBB 500 500", "AAA 400 420");

my %sum;
foreach (@record) {
my($key, @value) = split /\s/;
for (my $i = 0; $i <= $#value; $i++) {
$sum{$key}->[$i] += $value[$i];
}
}
foreach my $key (sort keys %sum) {
print"$key => $key @{$sum{$key}}\n";
}

つか >>19 のコードは興味深いな。一つ勉強になったよ。
0026nobodyさん03/04/15 21:17ID:???
use strictの時は、undefのreferenceがランタイムエラーになる。
00272503/04/15 22:13ID:???
>>26
上のコードに use strict つけて @record を my 宣言して
走らせたけど、エラーになりませんでしたよ。
5.005_03 と 5.8.0 で確認。

リストリファレンスでないものを無理矢理リストとして
デリファレンスしたらエラーになるけど、代入時は
勝手にやってくれますよね?

use strict;
my $foo;
print @{$foo}; # ランタイムエラー

$foo->[2]{'bar'}[10] = 'baz';
print join '/', ($foo, $foo->[3], $foo->[2]{'bar'}, $foo->[2]{'bar'}[10]); # OK
0028nobodyさん03/04/15 22:31ID:???
あ。。。+=は代入扱いだな。鬱
0029nobodyさん03/04/15 23:20ID:???
質問させてください。
例えば、あいうえおかきくけこ という文章の時、5文字目までを残して、
あいうえお までを表示させて最後に・・・を付けるというような形です。

あいうえおかきくけこ

あいうえお・・・

みたいにする方法を教えてください。
0030nobodyさん03/04/15 23:26ID:???
>29
どのような文字が入っているかによって変わる。
全て2バイト文字だと断言できるならsubstrでもできる。
1バイト文字と2バイト文字が混ざるなら、文字コードを読んで判断させなければならない。
■ このスレッドは過去ログ倉庫に格納されています