トップページ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バイト文字が混ざるなら、文字コードを読んで判断させなければならない。
0031nobodyさん03/04/15 23:38ID:???
>>30
早速お返事をありがとうございます。
ホームページの名前なので英語だったり日本語だったりしますので
下のにあたりますでしょうか?できればその方法を教えてください。
0032nobodyさん03/04/15 23:43ID:???
>>31
この辺参考にしる。
http://www.din.or.jp/~ohzaki/perl.htm#JP_Split
0033nobodyさん03/04/16 00:01ID:???
>>32
ありがとうございます。
URLのホームページを拝見したのですが難解でどこの事なのか分かりませんでした。
リンク集のログデータをトップページに表示させるためのデータをまとめるスクリプトを書いています。
どなたか方法を教えてください。お願いします。
0034nobodyさん03/04/16 00:13ID:???
>33
クリックせずにコピペしてみろ。
ちゃんとどこを見るかまで教えてくれている。
それ以上は自分で考えれ。
0035nobodyさん03/04/16 00:16ID:???
基本的にこのスレは「自分で解決しようと努力してるけどできない」人には優しいが、
「最初から全部教えてもらおうとしている」人には冷たい。
Perlのサポートセンターじゃないんだから。
回答側もボランティアだ。

よぉく>>1を読んでくれ。
>一緒に勉強しましょう。
勉強するのは教わる事じゃない。
考える事だ。
0036はしのえみ好きー03/04/16 00:26ID:???
>基本的にこのスレは「自分で解決しようと努力してるけどできない」人には優しいが、
>「最初から全部教えてもらおうとしている」人には冷たい。
このスレに限ったことじゃないよね。
後者に優しいのは宿題任せろスレぐらいだ。
0037nobodyさん03/04/16 00:27ID:???
コピペしようとはもうとう考えておりませんので、
substrの方法はわかりましたが、
1バイト文字と2バイト文字が混ざると駄目なようで。
この方法をどうか教えてください。
0038はしのえみ好きー03/04/16 00:27ID:???
何か反論みたいになってしまったがそうではなくて、>>35には概ね同意。
0039nobodyさん03/04/16 00:28ID:g3p2EJXO
>>36
ウソだけど、はしのえみのヌード持ってるぞ
0040はしのえみ好きー03/04/16 00:30ID:???
>>39
マジっすか!?
0041nobodyさん03/04/16 00:35ID:???
>37
>32のリンク先になにがあった?
文字単位に分割できれば、そこで文字数を数える事はできるよな?
そうしたら、最初5文字だけ残して、その後ろを消して置き換え。
あとは自分でやってくれ。
0042nobodyさん03/04/16 00:51ID:???
ありがとうございます。
その部分は既にsubstrを教えて頂いたのできてます。
00433903/04/16 00:54ID:g3p2EJXO
>>40
最初にウソだけどって書いたのに・・・・・・
ウンコーーーーーー
0044Perl3級03/04/16 00:55ID:Zmk9zNa+
21-27
みなさん。ありがとうございました。
お陰さまで無事プログラムか完成しました(涙
ありがとう、ほんとうにありがとう(涙
0045nobodyさん03/04/16 00:56ID:???
ここってヌードやウンコで盛り上がれば教えてくれますか?
0046nobodyさん03/04/16 01:09ID:???
$title = "あいうえおかきくけこ";
$title = mb_strimwidth("$title",0,10,"...");
0047nobodyさん03/04/16 01:19ID:???
>>46
スマンそれ違う。
0048nobodyさん03/04/16 01:44ID:???
>>47
これは何でしょうか?試してみましたが動きませんでした。

現状はsubstrで・・・に変換する事が出来ましたが、
substrが、1バイトづつで指定していますので、
1バイト文字と2バイト文字の組合せでは場合によって、
文字化けが発生しまいます。先ほどホームページを教えて頂いたのですが、
今の私の力では読み取る力がありませんでした。
思考錯誤してみます。お騒がせして申し訳ありませんでした。
0049はしのえみ好きー03/04/16 01:55ID:???
>>43
>>40のメール欄読んでよ・・・・・・
○ンコーーーーー
0050nobodyさん03/04/16 02:26ID:+e/kztES
自己解決しました。

>>20
例えが良く判りませんでした。すみません。
005150=1803/04/16 02:27ID:???
0052chuu03/04/16 11:42ID:???
ユーザ名からホームディレクトリが存在するかをチェック知りたくて、
$username = "hoge";
if (-e "~$username") {・・・
とやっても、hogeというユーザが存在するにもかかわらずfalseになります。
チルダを使わずフルパスで指定すれば当然うまくいくわけですが、
ユーザ名からホームへのフルパスを得るようなことはできますか?
/etc/passwdを開いて検索しなければならないのでしょうか・・・
よろしくお願いいたします。
0053はしのえみ好きー03/04/16 11:45ID:???
~(チルダ)を展開するのはシェルのお仕事。Perlは知らんぷりっ
/home/$username でイーンジャネーノ?
0054はしのえみ好きー03/04/16 11:48ID:???
もしくはgrep $username /etc/passwd。あとは野となれ山となれ
0055chuu03/04/16 12:04ID:???
>>53様、すばやい回答ありがとうございます。
変な環境でして、/home/*で統一されているわけではないんです。
passwdファイル検索の方向で試してみます。
ありがとうございました。
0056 ◆hMJAPH9PWA 03/04/16 12:25ID:???
>>55
/etc/passwd用組み込み関数があるよ。
perldoc -f getpwent
perldoc User::pwent
およびgetpwent(3) man pageを参照のこと。
0057はしのえみ好きー03/04/16 12:34ID:???
>>56 そんなのがあったんだ。>>52じゃないがアリガd
0058nobodyさん03/04/16 13:20ID:fv/dMt9b
HTTP-Liteを入れようと思い、コマンドプロンプトで
ppm>install HTTP-Lite と打ち込んだのですが、

Error installing package 'HTTP-Lite': Could not locate a PPM binary of 'HTTP-Lit
e' for this platform

となってエラーになってしまいます。
検索はしてみましたが、さっぱり見当違いなものしか検索できませんでした。
どうかどうすればインストールできるか、ご教授お願いします。
0059nobodyさん03/04/16 16:28ID:???
PPM> search HTTP::Lite
Packages available from http://ppm.ActiveState.com/cgibin/PPM/ppmserver.pl?urn:/
PPMServer:
HTTP-Lite [2.1.1] Lightweight HTTP implementation
PPM>

あるけど
setでパス通ってるか見てみ
0060nobodyさん03/04/16 17:56ID:???
Perl串ってなんですか?
レンタルサーバーに置いて2ch書き込むのに使ってる人いる?
0061nobodyさん03/04/16 19:20ID:???
( ゚д゚)ポカーン
00625803/04/16 19:20ID:???
通ってなかったです、超初歩的ミスですみません^^;
0063nobodyさん03/04/16 22:53ID:NR7Y4aEI
>>49
そういういじめか・・・

でもまじでヌードは見たいがな、俺も。
あいつは何かむらっとくるもんがあるあいつはもう30なのに・・・・・
写真集出せ
0064nobodyさん03/04/17 00:24ID:qoz0Pxr2
Perlで作ったプログラムをcgiとして使うときって通常ファイルの拡張子は.plで使うのですか?
それとも何かコンパイラみたいので.cgiに変えるとかなんですか?
お願いします教えてください。

あとそのうち作ったcgiを配布してみたいと考えているのですが、そのときも拡張子が.cgiのほうが良いのですか?
0065nobodyさん03/04/17 00:33ID:???
.cgiじゃないと動かんだろ?
.plで動けば.plでいいじゃない?
0066はしのえみ好きー03/04/17 00:34ID:???
>>63
漏れ年上でかつ可愛い人が好き。はしのえみは理想だな。

>>64
スレ違い。ここははしのえみについて語るスレです。

Webサーバの設定で、拡張子".cgi"というファイルのリクエストを受けるとそれ用に処理するようになってる。
だから、設定によっては".pl"でもOKな時もある。
どっちにしろ".cgi"にしておけば安心。ファイル名を変えるだけでOKよ。
0067nobodyさん03/04/17 00:36ID:???
やれやれ・・・
0068nobodyさん03/04/17 00:38ID:???
スレ違い。ここははしのえみについて語るスレです。
0069nobodyさん03/04/17 00:55ID:???
漏れは坂下千里子が好きかも。
型グロ部ってイマイチ何かよくわかりません。
とあるCGIをDLして、それを解読中なのだが、
たとえば、
*option_pnt = $_[0];
*config_pnt = $_[1];
$ctl_sock = $config_pnt{"ctl_sock"};
$before = $option_pnt{"before"};
$after = $option_pnt{"after" };
$path = $option_pnt{"path" };
&jcode'convert(*before,"sjis");
&jcode'convert(*after ,"sjis");
&jcode'convert(*path ,"sjis");
のような部分があるのですが、
漏れ敵には、文脈に応じて柔軟に型を識別してくれるもの
くらいの認識なのですが、いまいちシックリきません。
どんなときに型グロ部使うと激ウマーなのか、どなたかご教授ください。
0070nobodyさん03/04/17 00:59ID:qoz0Pxr2
そうか、ただ拡張子を変えただけか。
いやてっきりPerlプログラムをコンパイルしているのかと思っていたから。
サンクスみんな
ついでにいうと63=64=俺や。
どうでもいいがな。

オマエがすれ違いやで。
0071nobodyさん03/04/17 01:02ID:???
配布するときは、圧縮してるサイトが多いね。lzh,zip,tar.gz
圧縮しないときはtxtにしてるところが多いね。
cgiだと多くの場合、実行されちゃうから。
■ このスレッドは過去ログ倉庫に格納されています