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

【Perl】初心者コーナー Part18

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

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

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

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

過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
023723202/12/06 01:11ID:???
>>236
ありがとうございます。基本的に間違ってますた。
で、requireとuseでは速度・負荷的には変わりないんでしょうか?
0238nobodyさん02/12/06 01:38ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
0239nobodyさん02/12/06 01:40ID:???
条件によっては読まんモンはrequireで条件分岐後に読み込んだ方が
余計なの読まないから良いんでない?
サブルーチンをインポートする必要がなければ、だけど。

あとは大差無いかと。
0240nobodyさん02/12/06 07:37ID:???
use だとinitにパラメタを渡せるのがちょい便利。
0241nobodyさん02/12/06 11:46ID:yzLDpzsK
$aiueo = "1■2■■■3■4■5■■■";
@values = split(/■/, $aiueo);
$i = 0;
foreach $value (@values){
 if($value eq ""){
  @values[$i] = "NULL";
 }
 print "$i : @values[$i]\n";
 $i++;
}
これを実行すると、
0 : 1
1 : 2
2 : NULL
3 : NULL
4 : 3
5 : 4
こう表示されます。
しかし、最後の5以降はsplitでは無視されてしまうようです。
自分としては
0 : 1
1 : 2
2 : NULL
3 : NULL
4 : 3
5 : 4
6 : NULL
7 : NULL
8 : NULL
としたいのですが可能でしょうか。
0242nobodyさん02/12/06 12:01ID:???
>>241
ものすごく安易な解ですがsplitする前に
$aiueo .= "EOL";
とかで後ろに文字をくっつけておいて、
splitした後にpopしてやると逃れることは
できます。

$aiueo = "1■2■■■3■4■5■■■";

$aiueo .= "EOL"
@values = split(/■/, $aiueo);
pop @valures;

$i = 0;


という感じです。
0243nobodyさん02/12/06 12:11ID:???
>>242
なるほど。確かに単純で確実ですね。
プログラムはアイデア勝負ですね。ありがとうございます。
0244nobodyさん02/12/06 12:20ID:q7PjCrzt
画像投稿型掲示板cgiのスクリプトなんですが、
サーバに保存するファイル名に投稿された時間を反映させるには(img200212061220.jpgのように)、
どのような記述が必要ですか?
0245nobodyさん02/12/06 13:24ID:???
>>244
スクリプトを見ないとわからん
こんな感じで作った文字列をファイル名につけてやりゃいいんじゃないの

@date = reverse((localtime)[1..5]);
$date[0] += 1900; $date[1]++;
$now = sprintf "%4d%02d%02d%02d%02d", @date;
0246nobodyさん02/12/06 13:27ID:???
>244
マルチは市ね
024724402/12/06 13:44ID:y8w9Rsa1
>>245

ありがとうございました。やってみます。
0248bloom02/12/06 13:47ID:7xw6gZYB

http://www.agemasukudasai.com/bloom/
024924202/12/06 15:19ID:0nNWvukl
なんか気になっていたんですが、>>242はバグありですね。
あのコードじゃ

$aiueo = "1■2■■■3■4■5■■■6";
とかのときに最後の値を捨ててしまいますんで、
後ろにくっつけるのは区切り記号込みにしないと
だめですね。

$aiueo .= "■EOL"
@values = split(/■/, $aiueo);
pop @valures;

で、うまくいくはず。
0250nobodyさん02/12/06 15:40ID:???
>>241
*もし*要素数が一定なのなら、素直にsplitに第3引数を渡すっていう手も。
0251nobodyさん02/12/06 15:41ID:???
$aiueo = "1■2■■■3■4■5■■■";
@values = map($_||'NULL', $aiueo=~/(.*?)■/g);
0252nobodyさん02/12/06 17:08ID:zqw+GwyU
perl5.6で、困っています。
ある文字(\x{100}以上かもしれない)が大文字か小文字か判定したいのですが、たとえば
「任意のアルファベット大文字1文字に一致するメタ表現」などはないんでしょうか。
それとも、UnicodeData.txtをいちいち読まなければならないんでしょうか。
0253nobodyさん02/12/06 17:50ID:???
掲示板を作っています。
改行数の多い書き込みは
「省略されました。全部読むには(略」 という感じで省略表示したいのですが
任意の改行数までを取得するにはどうすればいいでしょうか。
よろしくお願いします。
0254nobodyさん02/12/06 18:04ID:???
>253
改行でsplitとか・・・、色々あるでしょ。
何故思いつかん?
0255nobodyさん02/12/06 18:19ID:???
>>254
初心者コーナーだし別にいいじゃん。
0256nobodyさん02/12/06 18:35ID:???
Perlでスマートに最小値を求めるにはどうすればいいんでしょうか?
0257nobodyさん02/12/06 18:39ID:???
>>256 何の?
025825602/12/06 18:40ID:???
整数です。
0259nobodyさん02/12/06 18:43ID:???
>258
1だろ。
0260nobodyさん02/12/06 18:44ID:???
>>256
スマートかどうか知らんが、sortじゃだめなんですか?

sub numerically { $a <=> $b; }
@sorted = sort numerically LIST;

これで、最小値が@sortedの先頭に来ます。
026125602/12/06 18:55ID:???
>>260
ありがとうございます。
高度すぎて理解できてませんが、sortでやってみます。
0262nobodyさん02/12/06 19:01ID:???
>>260
それでは、あるリストの要素の最小値を求めることはできるけど、
「整数」の最小値を求めることはできないでしょう。
0263nobodyさん02/12/06 19:26ID:???
sub min(\@){
my $a_ref = $_[ 0 ];
my $min = $a_ref->[ 0 ];
foreach (@{ $a_ref }){
$min > $_ and ($min, $_) = ($_ , $min);
}
return $min;
}

my @b= (20, 19, 100, 75, 6);
print min @b;
026426302/12/06 19:39ID:Wd1BEmDy
ううっ、だめだ、、、。
@bの内容変わってる。
0265nobodyさん02/12/06 22:56ID:???
my(@list) = (20, 19, 100, 75, 6);
my($minimum) = sort { $a <=> $b } @list ;
print("$minimum\n");

これじゃダメ?
0266nobodyさん02/12/06 23:18ID:???
>>265
ダメ
0267nobodyさん02/12/07 00:15ID:???
最小値求めるのにソートすんのかよ。これだからperlerは…
0268nobodyさん02/12/07 00:19ID:ePZJKayy
@hogeに何個か入っていてforeachで最後の1つ前までprintしたいときって
どうすればいいんでしょう?
10個あったら$hoge[9]まで、とか。
0269nobodyさん02/12/07 00:23ID:???
>>267
もちつけ。
まぁいいじゃん、基本的な原理は同じようなもんだし。
0270nobodyさん02/12/07 00:49ID:???
>>268
10要素の配列で$hoge[9]までなら全部じゃん(w
foreach (0..$#hoge-1){
print $hoge[$_];
}
とか。
0271nobodyさん02/12/07 01:08ID:yEekv6g9
Perlで糞ゲームつくりました。お試し下さいませ。
http://www36.tok2.com/home/bttl/bttl-pc/
0272yani ◆saNSktNEdQ 02/12/07 01:19ID:KB9hByzA
my $least;
foreach (@list) {
$least ||= $_;
$_ < $least and $least = $_;
}

ベタな気がする。エレガントな解法求む。
0273yani ◆saNSktNEdQ 02/12/07 01:30ID:KB9hByzA
いや、これじゃだめだな。

my $least;
foreach (@list) {
defined($least) or ($least = $_, next);
$_ < $least and $least = $_;
}
0274yani ◆saNSktNEdQ 02/12/07 02:26ID:6Rt0AxGb
こちらのほうがましか。
しかしイマイチ美しさを感じないのは気のせいか。

my($least) = @list;
foreach (@list) {
 $_ < $least and $least = $_;
}
0275nobodyさん02/12/07 03:44ID:???
Perlは整数32bitだから・・整数の最小値は・・どうなの?
027626802/12/07 04:11ID:ePZJKayy
>>270
あ、確かに全部っすね・・・(w スマソ
こういう方法があるんですねぇ。おかげさまでうまくいきました。
ありがとうございます。
0277nobodyさん02/12/07 06:27ID:???
grepでデキルような気がしますが。
forを使ってないだけで中で回ってるのは一緒だけどな。
0278nobodyさん02/12/07 06:39ID:???
$min=$list[0];
grep { $min > $_ && ( $min = $_ ) } @list;

こんな具合かな。テストしてないけど。
0279nobodyさん02/12/07 06:44ID:???
minとmaxが逆じゃん。
駄目だ寝よう。
0280yani ◆saNSktNEdQ 02/12/07 09:40ID:6bq1sAwR
>>277
そうそうgrepがあった。

手元の5.8.0の標準モヂュールで面白いものを見つけた。

use 5.8.0; ###
use List::Util qw(min);
...
$least = min(@list);
0281yani ◆saNSktNEdQ 02/12/07 11:42ID:6bq1sAwR
まあ、考えていたものがそのまんまあったわけで、それだけなら大して面白くも
ないんだが、「面白い」(ことができるかもしれない)と言ったのは List::Util::reduce のことだ。
0282nobodyさん02/12/07 11:46ID:???
やに言ってんだYO!
0283nobodyさん02/12/07 16:22ID:???
ひとりごとが多いスレですね。
0284nobodyさん02/12/07 16:24ID:/TptzaIR
結構前々から思っていた疑問なんだけど、
エラー表示させる場合「&error("文字列");」を使う例を良く見るのだが、
この場合「sub error{}」は用意しなくて良いのだろうか?
所持する本には書かれていなくて……。

ちなみに漏れは「die」関数を使ってます。
0285nobodyさん02/12/07 16:58ID:???
ふーん。。。
0286nobodyさん02/12/07 18:32ID:???
帰ってこないからgoto error使ってるけど、、、別にいいよね?
0287nobodyさん02/12/07 20:46ID:???
>>284
自分でつくるんでねぇ?

>>286
構造化プログラミングとかの本を見ると、GOTO分はプログラムの流れがワープしちまって
全体を把握するのが困難になるからいくないらしい
昭和57年頃の本だけど(藁
0288nobodyさん02/12/07 21:03ID:???
goto の先でプログラムがお亡くなりになるということが
わかっていたら混乱することもないんじゃない?
0289nobodyさん02/12/07 21:06ID:???
>>284
自分で好きなの作ろうぜ。>sub error { }
きちんとエラーメッセージ吐いてその時の環境変数やら標準入力の内容やらも表示すれば、
デバッグに便利。
0290nobodyさん02/12/07 21:54ID:HolpJHok
外部のWWWサーバからファイルを取得するのに一番負荷が少なくて、早いのは何ですか?

SOCKET
WGET
LWP

WGETはサーバに入っていないので。。
LWPよりSOCKETの方が早いと思うんですが。
0291nobodyさん02/12/07 22:00ID:???
>>288
自分だけが読むとは限らない罠
そして1年後の自分は別人である
0292nobodyさん02/12/07 22:31ID:HolpJHok
これはマジで儲かりますよ!!
実際私はこれで毎月30000円稼いでいます、
しかも毎月1000万円が当たるチャンスなどあります。
お小遣い稼ぎに是非!!!

http://www.fruitmail.net/cgi/introduce_jump2.cgi?901913
0293nobodyさん02/12/07 22:58ID:???
>>290
Socketの方がなんぼか早いだろうなあ。
でも、それぐらいだったらLwp使って安全かつシンプルに持ってくる方が俺はいいな。
SocketだったらRFCとかきちんと目を通さないと、正しいものは作れないだろ?
0294nobodyさん02/12/08 10:58ID:H7RlugSZ
perlstyleのよると、サブルーチンは全部小文字のほうがいいと書いてあるけど、どうしてですか?
0295nobodyさん02/12/08 11:38ID:???
>>294
「サブルーチン名は、全部小文字の方がいい」だろ?
モジュール名は(プラグマ以外は)大文字で始めろともあるだろう。
それと合わせたんじゃないか? 区別がすぐにつくように。
ま、作法の話だから、あんまり深く考えるな。
従ってれば、いつかきっと自分の中で決着がつく。
0296nobodyさん02/12/08 11:43ID:???
sub SuBrOuTiNe{
    print "ふーん。。。\n";
}
0297nobodyさん02/12/08 12:07ID:H7RlugSZ
>>295
なるほど、ソースの読みやすさのためなんですね。
モジュールは使ったことがないので今まで気にならなかったんだと思います。
0298nobodyさん02/12/08 13:10ID:???
シツモソです。
Perlで、累計・今日・昨日のアクセス数をカウントするカウンターCGI(IMG or JSタグでCGI起動)
を設置しようと思ってるんですが、カウントの方法で少し悩んでます。

count.cgi?total でカウント処理(累計+1, 今日+1)
count.cgi?today で今日のカウントをロードするだけ
count.cgi?yesterday で昨日のカウントをロードするだけ

上の順でCGIが呼ばれると正常にカウントされるんですが、
昨日、今日、累計の順に呼ばれると、当然昨日と今日のデータはカウントされる前のものになっちゃいます。

今日と昨日のCGI が呼ばれたら、sleep(1)をして、累計のカウントがおわるまで待つ
というのも考えたんですが、あまりいい方法じゃないなーなんておもいますた。

また、カウントだけをする count.cgi?count みたいなタグを入れて、
そのタグを一番上に置いて、累計・今日・昨日のタグがきたらカウントデータを読むだけ
ってしても、やっぱり設置場所によってはデータがずれたりしてきちゃいます。

おい、おまえら!もしいい方法がありましたら教えて下さい。
0299nobodyさん02/12/08 13:37ID:???
count.cgi?totalで累計のカウントを+1して累計のカウントを出力
count.cgi?todayで今日のカウントを+1して今日のカウントを出力
count.cgi?yesterdayで昨日のカウントを出力

で良いべさ。
030029802/12/08 13:40ID:???
>>299
( ´,_ゝ`)プププッ!!
0301nobodyさん02/12/08 16:23ID:GWJer8wb
jcode.plは$hoge{'hoge'}を変換できないんでしょうか?
&jcode::convert(\$hoge{'hoge'},'euc');
てやってもだめなので一回普通に変数に代入して変換して元に戻して
いるんですが・・・。
0302nobodyさん02/12/08 17:22ID:???
>>301
それは何かが違うから。
0303nobodyさん02/12/08 23:59ID:???
今、掲示板を作成中なんですが、ファイルロックの掛け方がいまいち分からない・・・・
flockの使い方教えてくらはい。とりあえずはflockがサーバで使えるみたいなので。
そんなやつが掲示板など作るな!とかいわれそうですがお願いいたします。
参考になるサイトだけでも結構なんでお願い。
半日ググってたら、何が何やら分からなくなってしまいました。
0304nobodyさん02/12/09 00:07ID:???
>303
ttp://www.google.com/search?num=100&hl=ja&ie=UTF-8&oe=UTF-8&as_qdr=all&q=perl+flock+%E4%BE%8B&lr=lang_ja
検索サイトの使い方のコツを覚えた方がいいんじゃないか?
0305nobodyさん02/12/09 00:21ID:???
素早い回答ありがとうございます。
今まで「perl cgi flock 掲示板」やら「flock 掲示板」やら、
しらみつぶしにサイトを見まくっていたら頭が変になっていました。
「例」で検索するのをすっかり忘れていました。
本当に感謝です。>304
0306nobodyさん02/12/09 20:40ID:30vqgT1r

%ex = (
hoge => "hage",
xxxx => "$ex{hoge}",
);



みたいにしたいのですが、
Global symbol "%ex" requires explicit package name at ファイル名 line 13.
みたいにエラーが出ます。
どうすればいいですか?
よろしくお願いします。
0307nobodyさん02/12/09 21:00ID:???
#use strict;
0308nobodyさん02/12/09 21:01ID:???
my %ex
0309nobodyさん02/12/09 21:13ID:???
our %ex ;
0310nobodyさん02/12/09 21:14ID:???
your %ex;
0311nobodyさん02/12/09 21:34ID:30vqgT1r
>>307
use strict;をコメントアウトしたら、エラーは出なくなりましたが、
$ex{xxx} に $ex{hoge} の値が代入されていませんでした。

実際には、my %ex; です。写し間違えでした。
0312nobodyさん02/12/09 21:38ID:???
てかそんなことできんの?
0313nobodyさん02/12/09 21:59ID:???
>>311
(
hoge => "hage",
xxxx => "$ex{hoge}",
)
が評価される時点で$ex{hoge}に何も入っていないなら当然。
031430202/12/09 22:25ID:???
>>311
折角のstrictなソースをクズに変えるから糞
0315nobodyさん02/12/09 23:42ID:???
use strict って何?
0316nobodyさん02/12/09 23:46ID:???
おまじない
0317nobodyさん02/12/10 00:21ID:???
HTML::FillInForm って、
checkboxや、radioのcheckedは、引き継げないんですか?
031831702/12/10 00:29ID:???
出来ました。すいませんでしたー。
0319nobodyさん02/12/10 11:20ID:???
変数って変数で作ることできるんでしょうか。
たとえば、

$count;
$hoge;
foreach $count (1 .. 10){
 $hoge$count = "文字:$";
}
こんな感じでつまり、
$hoge1 = "文字:1";
$hoge2 = "文字:2";
〜
$hoge10 = "文字:10";
こういう事はできるのかなという事です。
これだとやはり$hoge$countの書き方がまずいようでエラーになります。
0320nobodyさん02/12/10 11:27ID:???
なぜ配列を使わないのかと小一時間問いつめたい。
0321nobodyさん02/12/10 11:59ID:???
>319
推奨:$hoge[$count]  # ただし$countが数字の場合のみ
推奨:$hoge{"$count"}  # $countが文字列の場合
非推奨:${"hoge$count"}
0322nobodyさん02/12/10 12:53ID:???
>>320
ごめんなさい、小一時間じゃ済みそうにないんでまた次回。
>>321
その技の名前はなんですか。
0323nobodyさん02/12/10 13:14ID:???
 配 列 と 連 想 配 列 ( ハ ッ シ ュ ) で す が な に か ?
0324nobodyさん02/12/10 13:22ID:???
× 推奨:$hoge[$count] # ただし$countが数字の場合のみ
○ 推奨:$hoge[$count] # ただし$countが自然数の場合のみ

負の数とか小数を使われたらたまらんから訂正。
0325nobodyさん02/12/10 13:26ID:???
自然数の定義を教えて下さい。
0326nobodyさん02/12/10 13:31ID:???
辞書引け。
0327nobodyさん02/12/10 14:02ID:+QGYbS02
1バイトと2バイトが混在している文字列から頭の3文字を
抽出するにはどうすればいいのでしょうか?
例えば『あいうえお』,『Aいうえお』などの場合です。
substrを使うと『Aいうえお』がおかしくなってしまいます
0328nobodyさん02/12/10 14:10ID:???
>327
ttp://www.din.or.jp/~ohzaki/perl.htm#JP_Split
0329nobodyさん02/12/10 14:16ID:???
>328
Thanks
0330nobodyさん02/12/10 15:27ID:???
>>321
すいません、よく考えたらただの配列じゃダメなんです。
$hogeと$iを合体して、
「$hoge1」という変数自体を作りたいんです。
よって、「$hoge1」という変数に文字とかを代入したりしたんです。
0331nobodyさん02/12/10 15:46ID:???
質問お願いいたします。
書き込み処理の所なんですが、

open(OUT, "+<$dat");
flock(OUT, 2);
@sasa = <OUT>;
truncate(OUT,0);
seek(OUT, 0, 0);
print OUT "書き込み\n";
print OUT @sasa;
close(OUT);

    と

open(OUT, "+<$dat");
flock(OUT, 2);
@sasa = <OUT>;
seek(OUT, 0, 0);
print OUT "書き込み\n";
print OUT @sasa;
truncate(OUT, tell(OUT));
close(OUT);

ではどちらがいいんでしょうか?
ただtruncateの使い方がちょっと違うだけなんですが・・・。
それ以前に文法的に間違っていたらご指摘お願いします。
0332nobodyさん02/12/10 15:52ID:???
>>330
リファレンス使えばよろし。

>>331
下。
既出のような気がするのは思い過ごしでしょうか。
0333nobodyさん02/12/10 16:10ID:???
>>331
早速の回答Thanksです。
既出でしたか・・・お手数おかけしました。
過去ログまた読み直して出直してきます。
0334nobodyさん02/12/10 16:11ID:???
>331じゃなかった
>332さんごめんなさい。
0335nobodyさん02/12/10 16:17ID:???
>>330
せめて、配列じゃなくって$hoge1という変数が欲しい
理由を書いてもらえませんか? もしかするとその原因
自体変更することで、全体としてすっきりするっていう
可能性もありますから。
0336nobodyさん02/12/10 19:01ID:4NsDPNiK
パスワード生成と、照合を別スクリプトにするのはやっぱりだめですか?

作ろうとしてるのは、パスワードを作るだけのスクリプトと、そのパス
を使って管理する掲示板なんだけど・・・文法チェッカかけたら
「Missing right curly or square bracket at hoge.cgi line 65, at end of line
syntax error at hoge.cgi line 65, at EOF
hoge.cgi had compilation errors.
」
ってなってしまった。。。
■ このスレッドは過去ログ倉庫に格納されています