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

Perlコーディング初心者質問スレ Part 48

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/04/26(水) 18:00:50ID:RLbnve1J
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0331nobodyさん2006/05/11(木) 17:12:26ID:???
>>325
$_ and $line = $_ for @data;
0332nobodyさん2006/05/11(木) 17:14:10ID:???
$_ ne '' and $line = $_ for @data;
初歩的間違い >> 331
03333252006/05/11(木) 17:33:07ID:mIPF1ZNx
>>330さん、>>332さん、ありがとうございます。
イテレーションを5000回に増やして試してみました。
なお、>>332さんの方はreverseが必要になると思うので、追加しています。

Benchmark: timing 5000 iterations of No.330, No.332, foreach, until...
No.330: 3 wallclock secs ( 3.31 usr + 0.39 sys = 3.70 CPU) @ 1350.26/s (n=5000)
No.332: 5 wallclock secs ( 3.94 usr + 0.23 sys = 4.17 CPU) @ 1198.75/s (n=5000)
foreach: 4 wallclock secs ( 3.89 usr + 0.19 sys = 4.08 CPU) @ 1226.09/s (n=5000)
until: 3 wallclock secs ( 3.42 usr + 0.14 sys = 3.56 CPU) @ 1403.31/s (n=5000)
03343252006/05/11(木) 17:35:50ID:mIPF1ZNx
すみません、ちょっとミスしたところがあるので計り直しです。

Benchmark: timing 5000 iterations of No.330, No.332, foreach, until...
No.330: 4 wallclock secs ( 3.30 usr + 0.36 sys = 3.65 CPU) @ 1367.99/s (n=5000)
No.332: 4 wallclock secs ( 3.42 usr + 0.28 sys = 3.70 CPU) @ 1350.26/s (n=5000)
foreach: 4 wallclock secs ( 3.83 usr + 0.28 sys = 4.11 CPU) @ 1216.84/s (n=5000)
until: 4 wallclock secs ( 3.23 usr + 0.38 sys = 3.61 CPU) @ 1385.04/s (n=5000)
0335nobodyさんNGNG
あんまどれも変わらんね
読みやすいコードでいいんじゃないかな?
0336nobodyさん2006/05/11(木) 17:38:51ID:???
要するにどうでもいいと、そういうことですか?
0337nobodyさん2006/05/11(木) 17:40:42ID:???
>>333
>>332の方式は、先頭から空行でなければ$lineへ代入を末尾まで行う方式のためreverseすると間違いです。
@dataがオンメモリという前提だとあまり効率的でないかも?ですが、
ファイルからの読み込み時にそのまま適応できる、ということですね。
03383252006/05/11(木) 17:40:59ID:mIPF1ZNx
ごめんなさい、泣きの一回です。これで帰ります。みなさんありがとうございました。

>>325に書いたスクリプト、reverseの位置を変えただけで処理速度がかなり上がります。

foreach (reverse @data) {
if ($_) {
$line = $_;
last;
}
}

結果:
Benchmark: timing 5000 iterations of No.330, No.332, foreach, until...
No.330: 4 wallclock secs ( 3.42 usr + 0.33 sys = 3.75 CPU) @ 1333.69/s (n=5000)
No.332: 3 wallclock secs ( 3.47 usr + 0.30 sys = 3.77 CPU) @ 1328.02/s (n=5000)
foreach: 4 wallclock secs ( 3.25 usr + 0.34 sys = 3.59 CPU) @ 1391.21/s (n=5000)
until: 4 wallclock secs ( 3.27 usr + 0.39 sys = 3.66 CPU) @ 1367.24/s (n=5000)

ここまで来ると誤差の範囲ですね…。ではまた。
0339nobodyさん2006/05/11(木) 17:46:37ID:???
最下行からループしたほうが早いんでない?
0340nobodyさん2006/05/11(木) 17:56:23ID:???
$_ ne '' and $line = $_ for 0..$#data;
こうか。
0341nobodyさん2006/05/11(木) 17:57:32ID:???
ちがう、全然違う!無視してくれ
03423252006/05/11(木) 17:58:35ID:???
>>337
なるほど、勘違いして失礼しました。
結果は貼りませんが、reverseを追加しなければ僅差でNo.332が最速でした。
まあどれもほとんど同じ、お好みでって事になりますね。

>>339
No.332以外は最下行からループするアルゴリズムになっていると思います。
ただNo.332は上から全部見て行っても遅くありませんでした。
0343nobodyさん2006/05/11(木) 18:07:20ID:???
reverseにかかる時間とforでloopする時間とに違いがあるかどうかだな。
添え字付けアクセスは結構遅いということか。
0344nobodyさん2006/05/11(木) 18:23:21ID:???
初心者の自分としては、こう書いてもらいたい。

do {
$line = pop @data;
} while($line eq "");
0345nobodyさん2006/05/11(木) 19:19:12ID:???
>>332 をもう少し早くしたいなら

$_ ne '' and $line = $_, last for @data;

until で書くと

1 until ($line = pop @data) ne '';
0346nobodyさん2006/05/11(木) 19:20:50ID:???
あ、reverse が必要か。

$_ ne '' and $line = $_, last for reverse @data;

短いのは until のやつかな。
0347nobodyさん2006/05/11(木) 20:50:54ID:V8lYCtov
#!/usr/local/bin/perl

$maximum = 99999;#カウンターの最大値(最大値を超えると0に戻ります。)
$value = "%05d";#カウンターの桁数( %04d, %05d, %06d ←このように桁数を変更して下さい。)
$countfile = "count.txt";#ログファイル(カウンター)
$ipfile = "ip.txt";#ログファイル(IP)

open (COUNT, "<$countfile");
flock(COUNT, LOCK_SH);

chomp($count = <COUNT>);
$iplog = <COUNT>;

close(COUNT);

$ip = $ENV{ 'REMOTE_ADDR' };
$maximum = sprintf("$value", $maximum);

if( $ip ne $iplog ){ $count++; }
if( $maximum < $count){ $count = 0; }

open (IP, ">$countfile");
flock(IP, LOCK_EX);

print IP ($count."\n");
print IP ($ip);

close(IP);

0348nobodyさん2006/05/11(木) 20:53:04ID:V8lYCtov
#時間取得
($sec, $min, $hour, $day, $mon, $year) = localtime(time);
$year = $year + 1900;
$mon++;
$sec = sprintf("%02d", $sec);

open (LOG, ">>$ipfile");
flock(LOG, LOCK_EX);

print LOG ($ip."\n");
print LOG ($year."/".$mon."/".$day."\t".$hour.":".$min.":".$sec."\t".$ENV{ 'HTTP_USER_AGENT' }."\n\n");

close(LOG);

$count = sprintf("$value", $count);

print "Content-Type: text/html\n\n";
print "document.write('$count')";

exit;
0349nobodyさん2006/05/11(木) 20:55:54ID:???
上記スレ二つに書いたコードなんですが、
これをもっと高速化するにはどうしたらいいですか?

SSIのexecとincludeが使用できないので、Javascriptで
呼び出しています。
他にもっといい呼び出し方などあったら是非教えてください。
0350nobodyさんNGNG
特にないんじゃない?
突っ込みどころは沢山あるけど
0351nobodyさん2006/05/11(木) 20:58:34ID:V8lYCtov
>>350
その突込みをお願いします。
0352nobodyさん2006/05/11(木) 20:58:55ID:???
$count = sprintf("$value", $count);
この行必要?
0353nobodyさん2006/05/11(木) 21:11:01ID:???
>>347
・ファイルのオープンには絶対エラーチェックを入れる
・ファイルを二回にわけてオープンしてたら、ロックの意味が無い

最低この二点を勉強して。
0354nobodyさん2006/05/11(木) 21:12:04ID:???
突っ込みどころ多すぎて、全部突っ込めと言われたら完全に書き直しになるが、
あえて一つ突っ込むなら、$countfileを一旦閉じて開きなおしてるのはいかん。
これじゃアクセスが重なると空回りするぞ
+<モードで開いておいて、読み終わったら頭にseekして書き込み、
そして閉じる前にtruncateするのが最適解かと。
0355nobodyさん2006/05/11(木) 21:22:32ID:???
my $line = $_ while( pop @data );
でいいと思う。
行にゼロは無いと仮定しているレスばかりだが、いいのか?
0356nobodyさん2006/05/11(木) 21:44:25ID:???
>>355
definedは厳密に言えば付けた方が良いですが、まあ一般に要らないと思います。
0357nobodyさん2006/05/11(木) 21:56:16ID:???
変数のスコープって何で大事なの?グローバル変数だけのプログラムは何故だめなの?引数なしの関数は何故悪いの?
0358nobodyさんNGNG
汎用的でない、読みにくい等…
0359nobodyさん2006/05/11(木) 22:13:02ID:???
>変数のスコープって何で大事なの?
スコープの範囲によって変数の値が変わる場合があるから。
グローバル変数にするとスコープの範囲がグローバルになるから、範囲を気にする必要なくなる。

>グローバル変数だけのプログラムは何故だめなの?
規模が大きくなると破綻するらしいけど、自分で管理できるならグローバル変数でOKなんじゃない?

>引数なしの関数は何故悪いの?
暗黙のうちにグローバル変数を使うことになるから。
0360nobodyさん2006/05/11(木) 22:22:38ID:???
スコープ内で使用する変数全てをローカル変数に一気に宣言してしまう方法はないでしょうか?
my()宣言するのがとても大変です。
またグローバルで使う場合もある処理の場合、そのままコピペできればと思うのですが

よろしくお願いします
0361nobodyさん2006/05/11(木) 22:26:41ID:???
>>325
今更だけど
if($data[-1]){
 $line=$data[-1];
}
これじゃ駄目なの?
0362nobodyさん2006/05/11(木) 22:38:48ID:???
>354
+<でopen
read
seek
truncateで0バイト化
print
って手順てこと?
truncateで0バイト化するならseekは要らない気もするけどどうなんでしょ?

言葉が足りなくて上げ足取りみたいな感じたらスマソ

それとも桁が減った場合を考えてのtruncateを使用ってことでしょうか?
0363nobodyさん2006/05/11(木) 22:40:33ID:???
>>355
$lineが拾えないのですが…。(undefになっているようです)

>>361
ファイルの最終行が空行かも知れません。
その前の行も空行かも知れません。
0364nobodyさん2006/05/11(木) 22:46:51ID:???
>325
my($linecnt) = $#data;
my($lastline);
if($linecnt){ $lastline = @data[$linecnt]; }

0365nobodyさん2006/05/11(木) 22:50:23ID:???
>>364
-wでwarningが出て、さらに最終行に空行が入っていると中身を取得出来ないようです。
0366nobodyさん2006/05/11(木) 22:53:24ID:???
>363
そうゆうことがあるなら・・・
$linecnt = $#data;
for $i ($linecnt..0){
 $lastline = chomp($data[$i]);
 if($lastline){
  last;
 }
}
もしループを抜けて$lastlineが空なら、@dataは空か、改行だけしかないデータとなる
0367nobodyさん2006/05/11(木) 22:58:30ID:???
>>362
スマソ、少し説明が足りなかった。桁が減った場合を考えて、だね。
truncateとprintが逆で、書き込んだ後に、tellしてその長さにそろえるの。
read
seek
print
truncateで現在位置(tell)まで切り詰め

truncateは位置が頭に戻ることを保障されてないから、その場合でもseekを消すとまずいかも。
susv3のftruncate仕様より
> The value of the seek pointer shall not be modified by a call to ftruncate().
0368nobodyさん2006/05/11(木) 23:13:43ID:???
あっ、なるほど
書き込み後のファイル位置まで削るってことか。

書き込み後のファイル位置は気にしたこと無かったから想像できなかったわ
0369nobodyさん2006/05/11(木) 23:16:04ID:???
>>357
本物のプログラマはローカル変数を使わない
・本物のプログラマは全てのグローバル変数を混乱せずに管理出来る。
・本物のプログラマはサブルーチンを作るときに引数を使わない。
・本物のプログラマは不要になった変数空間が解法されずに残ることを恐れない。

本物のプログラマなら誰でも知っている通り、有用な変数のスコープはグローバル変数しかないのだ。
さまざまな関数の一時変数や再帰、さらにはクロージャの変数管理はすべてグローバル変数で実装可能であり、わざわざ複雑な構造を取り入れてプログラミング言語をごちゃごちゃにせずとも、ただの特殊な場合として扱うことが可能なのである。
このような手の込んだ構造の最悪な点は、それらを使うときにいちいち宣言しなければならないと言うことにある。
0370nobodyさん2006/05/11(木) 23:22:13ID:???
初心者が勘違いするからやめなよ…
0371nobodyさん2006/05/11(木) 23:27:17ID:???
>>370
ああごめん、初質スレだったな…せめて最後に一言加えるべきだったか
0372nobodyさん2006/05/12(金) 00:21:46ID:???
ここじゃ釣れないぞ
0373nobodyさん2006/05/12(金) 00:40:59ID:???
ちょと質問です

$data = "\0\0\0\x0a";
$data =~ s/([\x00-\xff]{$n})$/ func($1) /e;

データ末尾 nバイトを置き換えようとしてるんですが
なぜか 0x0A にマッチしてくれません。
これは一体どうゆうことでしょうか?
そしてこれはどう書くべきなのでしょうか?
お願いします
0374nobodyさん2006/05/12(金) 00:55:45ID:???
>>373
s/(.{$n})\z/ func($1) /se
ttp://www.kt.rim.or.jp/~kbk/perl5.005/perlre.html
| s 文字列を単一行(single line)として扱います。つまり、``.''が通常はマ ッチしないような改行を含めた、全てのキャラクターにマッチするようにします。
| $ 行の終端(もしくは行末の改行の直前)にマッチします
| \z 文字列の終端にのみマッチします
0375nobodyさん2006/05/12(金) 01:07:50ID:???
>374
ありがとです。
スッキリしました。
0376nobodyさん2006/05/12(金) 01:36:29ID:???
>>325
$_が項で主張してるとPerlっぽくない。
というかもし、最終行以外捨てるならそこが一番重いところになる。
$line = grep /./, @data;
0377nobodyさん2006/05/12(金) 02:33:59ID:???
>>376
$line = (grep /./, @data)[-1];

それもよさそうだね。
>>377 >>345 >>346あたりが最小限の走査ですむように
工夫されてるのでよさそう。
0378nobodyさん2006/05/12(金) 02:36:06ID:???
>>375
もっとすっきりするには・・・

s/(.{$n})\z/ func($1) /sex;
0379nobodyさん2006/05/12(金) 03:55:19ID:???
悔しいけどちょっとウケた。
0380nobodyさん2006/05/12(金) 04:06:26ID:???
>>378
typoじゃね?
s/(.{$n})\z/ fuck($1) /sex;
03813252006/05/12(金) 09:22:53ID:???
おはようございます。昨晩はいろいろありがとうございました。

Benchmark: timing 50000 iterations of No.330, No.332, No.344, No.345, No.346, No.366, foreach(338), grep(377), until(327)...
No.330: 3 wallclock secs ( 2.98 usr + 0.06 sys = 3.05 CPU) @ 16409.58/s (n=50000)
No.332: 4 wallclock secs ( 4.06 usr + 0.08 sys = 4.14 CPU) @ 12074.38/s (n=50000)
No.344: 3 wallclock secs ( 2.92 usr + 0.02 sys = 2.94 CPU) @ 17018.38/s (n=50000)
No.345: 3 wallclock secs ( 2.91 usr + 0.00 sys = 2.91 CPU) @ 17205.78/s (n=50000)
No.346: 3 wallclock secs ( 2.88 usr + 0.13 sys = 3.00 CPU) @ 16666.67/s (n=50000)
No.366: 3 wallclock secs ( 2.75 usr + 0.03 sys = 2.78 CPU) @ 17979.14/s (n=50000)
foreach(338): 3 wallclock secs ( 2.73 usr + 0.03 sys = 2.77 CPU) @ 18076.64/s (n=50000)
grep(377): 3 wallclock secs ( 3.08 usr + 0.05 sys = 3.12 CPU) @ 16005.12/s (n=50000)
until(327): 3 wallclock secs ( 2.84 usr + 0.03 sys = 2.87 CPU) @ 17391.30/s (n=50000)

個人的には>>376-377さんのgrepを使ったアルゴリズムが好きです。

注)
@dataが壊れる(壊れても構わないのですが)場合、結果がおかしくなるので
公平を期すため、全てのテストルーチンには@data = @backup;を入れています。
それが不要なアルゴリズムは、省けばさらに速くなります。
(昨日出したベンチマーク結果は毎回ファイル開いて読んでました…無駄すぎですね)

また、@dataにはchompが掛かっているので>>366さんからはそれを省いています。
0382nobodyさん2006/05/12(金) 09:54:06ID:???
>>381
@data=@backupだけのも測定して欲しい。そうすれば引き算して比べられる。
03833252006/05/12(金) 10:03:29ID:???
>>382
backup: 3 wallclock secs ( 2.72 usr + 0.02 sys = 2.74 CPU) @ 18281.54/s (n=50000)


謎です、これじゃ引き算出来ません。
benchmarkの測り方を間違えていたなんていう強力なオチがありそうで怖いですが…。
どこかにスクリプト自体をアップした方が良いですかね?
03843252006/05/12(金) 10:16:16ID:???
http://read.kir.jp/file/read46406.zip
何となくパス付き:perl

テストデータは同梱していません。
そこそこ大きいテキスト+末尾に4〜5空行を入れてtest.datとして保存して下さい。
0385nobodyさん2006/05/12(金) 10:21:57ID:???
まとめると、こんな感じ?

>>327 >>344 >>345
popで配列の後ろから取り出して調べる

>>330 >>366
配列の後ろから添え字アクセスで調べる

>>338 >>346
配列を一旦reverseして、先頭から調べる

>>332
配列の先頭から調べる

>>377
grepで空要素を排除してから、最後の要素を取り出す
0386nobodyさん2006/05/12(金) 10:43:29ID:???
>>383
もちろんそのまま引き算できるわけでなく、たとえば 回数/s の逆数をとって一回あたりの
秒数をだして引き算するわけよ。
03873252006/05/12(金) 11:03:32ID:???
>>385
まとめ、大変分かりやすいです。どうもありがとうございます。

>>386
なるほど、あの結果はあれでおかしくはないんですね。
とりあえずスクリプトは>>384でアップしましたので、お好きな方にカスタマイズは
お任せするつもりです。
0388nobodyさんNGNG
いい加減うざいんだけど
0389nobodyさん2006/05/12(金) 13:08:04ID:???
>388
それは自分への言葉ですか?
分かってるなら消えろよカスwww
0390nobodyさんNGNG
( ^ω^)やだお
0391nobodyさん2006/05/12(金) 14:15:44ID:DNrRJ4oV
aboneで読めないな。。
0392nobodyさんNGNG
どうやってあぼーんしてるか気になるなぁ
Be全体をあぼーんでもしてるのだろうか(笑)
0393nobodyさん2006/05/12(金) 14:35:17ID:???
abone設定完了。簡単。
0394nobodyさんNGNG
(;^ω^)
0395nobodyさんNGNG
目的
ファイル掲示板のcgiで、ファイルのDLカウンターを付けたい

編集対象個所
<a href=\"$i_Url/$ico\" target=_blank>
$i_Url ファイルの置き場所のパス
$ico ファイル名

置換したいcgi呼び出し
./downcon.cgi?down=http://ohayou.com/test.zip&name=test.zipファイル&hp=http://ohayou.com

私の書き換えたコード
./downcon.cgi?down=$i_Url/$ico&name=$icoファイル&hp=hp=http://ohayou.com

結果
CGI呼び出しエラーのページが表示されてしまう


何がいけないのでしょうか?
教えてくださいませ。
0396nobodyさんNGNG
訳分からん
改造スレ池
0397395NGNG
出来ました^^
めげずに頑張ってみるものですね!
0398nobodyさん2006/05/12(金) 17:25:50ID:???
まんこがかゆい
0399 ◆TWARamEjuA NGNG
>>398
煮沸消毒しる!
0400nobodyさん2006/05/13(土) 00:50:41ID:RdM+BVxR
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "こんにちは!\n";

↑これだとInternalServerErrorが出るんですが、
#!/usr/bin/perl -w
に書き換えると正常に『こんにちは!』と表示されるのですが、どうしてでしょうか?
-wはエラーがあったら表示、みたいに思いこんでたんですが…
0401nobodyさん2006/05/13(土) 00:57:56ID:???
>>400
-wはwarningオプションなのでエラーとはまた違います。
(こういう書き方はイカンとか、間違ってるかも知れないとかの警告)

それで、ぱっと見た感じ間違いは無さそう。
正常に表示されるスクリプトから、「 -w」の3バイトを丁寧に削ってまた試してみては?
0402nobodyさん2006/05/13(土) 01:04:20ID:RdM+BVxR
>>401さん
なるほど、Warningの略だったんですね。
アドバイス通りに『 -w』を削ってみました。
1バイトあたり1分ぐらいかけて慎重に削り、パーミッションも744にしたのですが、
やはり『 -w』が無いと動かないようです。

というか、MovableTypeを見ていて『-w』と書いてあるのを見てマネしたら動いちゃった、
って感じなのですが、『-w』をつけないと動かないってことはあり得るんでしょうか?
0403nobodyさん2006/05/13(土) 01:04:56ID:???
>>400
既にFAQだなこりゃ
FTPで上げるときにBinaryモードで上げてるだろ。Asciiモードでやって見れ
0404nobodyさん2006/05/13(土) 01:12:21ID:RdM+BVxR
>>403さん
なるほど、それが原因なんですか…

これも既出もいいとこかもしれませんが、仕事中なのでコッソリ教えてもらえるとうれしいです。
IEでFTP接続しているんですが、AsciiモードやBinaryモードを切り替えることはできるのでしょうか?
よろしくお願いします。
0405nobodyさん2006/05/13(土) 01:14:24ID:???
何でもいいからIE以外のFTPクライアントを使うことを勧める・・・
0406nobodyさん2006/05/13(土) 01:29:23ID:RdM+BVxR
>>405さん
普段はFFFTPを使ってるんですが、今使ってるサーバーはFFFTPだと
ファイル一覧が取得できないんですよね…
しかし、MovableTypeはIEでアップロードして動いたのに、不思議なものです…
スレ違いになってしまったので、このあたりで失礼します。
親切にありがとうございました。
0407nobodyさん2006/05/13(土) 01:41:49ID:???
>>406
スレ違いで難だけど一応ここまで聞いちゃったら…
ホストの設定の"NLST -Rを使って高速に再帰取得"を切ってみれ。
それで駄目なら"LISTコマンドでファイル一覧を取得"にチェックを入れてみれ。

#!/usr/bin/perl[CR][LF] だとOSは"/usr/bin/perl[CR]"というコマンドを起動しようとする。
よってそんなインタプリタは見つからないのでエラー。
#!/usr/bin/perl -w[CR][LF] だとOSは"/usr/bin/perl"に"-w[CR]"を渡そうとする。
perlはCRを無視して無事起動。そういや、どこかの入門サイトでエラーになることがあるから、
shebang行には#!/usr/bin/perl -と書けと言っている迷サイトもあったと聞いたな。
0408nobodyさん2006/05/13(土) 01:56:30ID:RdM+BVxR
>>407さん
ありがとうございます。
おかげさまでFFFTPでファイル一覧が取得できてしまいました。
今までの苦労は何だったんだ、と怒りに震えるほど感謝しています。
今までの23年間の人生で初めて涙を流して感謝しました。
0409nobodyさん2006/05/13(土) 10:11:20ID:???
shebang行の最後にスイッチを終了させる「 --」をつけても解決できると思うよ。
0410nobodyさん2006/05/13(土) 19:48:15ID:???
my の使い方で質問です。例えば
foreach $line (@list_hoge) {
my ($key, $value) = split ":", $line;
$hash_ref_hoge->{$key} = $value;
で、my がループ毎に実行されるのが気分的によくないです。
繰り返しブロック中の一時的な変数って、ブロックの中/外、どちらで
宣言するのが一般的なんでしょうか?中で宣言するとループ毎に別変数に
なってしまう(と思う)し、外で宣言すると my の意味が無い気がする。
0411nobodyさん2006/05/13(土) 20:55:01ID:???
何で気分が良くないのか和漢ね
{ my $hoge;
for(@fuga) {

}
}
0412nobodyさん2006/05/13(土) 20:56:24ID:???
ありゃあ途中で送信しちゃったけどループの外のブロックで宣言すれば?
そういう事じゃなかったらごめん
0413nobodyさん2006/05/13(土) 21:28:32ID:???
だいたい$lineをmyしてないヤシが(ry
0414nobodyさん2006/05/13(土) 21:49:46ID:???
よほど繰り返し回数の多いループとかじゃなければ見易さ優先でいいと思うのだが。
0415nobodyさん2006/05/13(土) 21:56:02ID:vvOrsJnf
perlスクリプト内の'chop'は全て'chomp'に置き換えても問題ないですか?
#ちなみに、'chop'と'chomp'が混在してるスクリプトの場合です
0416nobodyさん2006/05/13(土) 22:04:22ID:???
>>415
chopとchompは意味が違うので、無条件に置き換えられるかどうかは不明
わざわざ混在してるとなると、置き換えられないかも
作者に聞いてくれ
0417nobodyさん2006/05/13(土) 22:05:08ID:???
>>416
はーい
レスありあとうございます
0418nobodyさん2006/05/13(土) 22:15:50ID:???
>>410
それでいいんだよ。
その1周分のループの中でしか使わないし、その明言でもある。
違和感あると言うけど、ひょっとして「my付けろって言われたからつけてる」って程度の認識だったりしない?
0419nobodyさん2006/05/13(土) 22:28:39ID:???
>>410
変数の寿命は短ければ短い方がいいという教えに従えば内側で宣言する。
別に外で宣言してもいいけどね。
04204102006/05/13(土) 22:33:22ID:???
>>411-414 ありがとう($lineのmy抜けはtypoということで。)
自分は >>414 と同じ考え方で質問に書いた書き方をしてるんだけど
「普通こう書くだろう」っていうのがあれば、と思い質問した次第です
(412 が「普通こう書く」なのかな?)
#あまり気にしないことにします。
04214102006/05/13(土) 22:52:39ID:???
あ、書いてる間にレスが・・
>>418 違和感は、
自分は「$key、$value はこの foreach ブロック(!=ループ)でワーク変数として使う」
つもりで宣言しているのに、ループ毎に別変数が生成されると、何か
変数入れるメモリがもったいないんじゃない?とか思ってしまう
からなわけです(貧乏性)。もしかしてループ毎に前のループの変数は
開放されるのかな? であれば問題ないな。
0422nobodyさん2006/05/13(土) 22:58:00ID:???
( ^ω^) ・・・
0423nobodyさん2006/05/13(土) 22:58:15ID:???
my宣言された変数はそのブロックの最後で消滅してるので
ループ中のmy宣言されてるものはその都度新しく生まれ変わってる別物です
0424nobodyさん2006/05/13(土) 23:02:54ID:???
生成と破棄が嫌ならループの外に出せば良い。
その場合は、同じ変数を使い回す事になる。
split後の$key, $valueの文字列長が、ループ内でだいたい同じ程度なら
Cレベルでのreallocもあまり気にしなくて良くなる。

一方、ループ内に入れた場合は、変数のメモリはループ毎にヒープに返される。
最適化がどうなってるか分からないけど、
もしかしたら同じスカラを使い回しているかも知れない。

微妙な違い。多分、ループ外に置いた方が速い。
0425nobodyさん2006/05/14(日) 01:28:41ID:???
>>421
内側が基本。
外側で宣言しちゃったら値の局所化、名前の局所化どちらも意味なくなっちゃうじゃん。
このPart48スレで何回か話題なったから読み返してみ。
もちろん、ループの進行と共に変化していく系の変数なら外のスコープで宣言するしかない。
0426nobodyさん2006/05/14(日) 02:15:49ID:EM3+kg+P
BBSスクリプトの一部なんですが、↓のような記述があります。

$message =~ s/<a href="\.\.\/test\/read\.cgi\/$FORM{'bbs'}\/$FORM{'key'}\/n?\d+-?\d*" target="_blank">(>>\d+-?\d*)<\/a>/$1/g;
$message =~ s/<r>>>(\d+)-(\d+)<\/r>/<a href="..\/test\/read.cgi\/$FORM{'bbs'}\/$FORM{'key'}\/n$1-$2" target="_blank">>>$1-$2<\/a>/g;
$message =~ s/<r>>>(\d+)-<\/r>/<a href="..\/test\/read.cgi\/$FORM{'bbs'}\/$FORM{'key'}\/n$1-" target="_blank">>>$1-<\/a>/g;
$message =~ s/<r>>>(\d+)<\/r>/<a href="..\/test\/read.cgi\/$FORM{'bbs'}\/$FORM{'key'}\/n$1" target="_blank">>>$1<\/a>/g;

これの一部分から“n”を抜いても問題はないですか?
具体的には、次の部分を右のように変更しました。

一行目:n?\d+-?\d → \d+-?\d
二行目:n$1-$2 → n$1-$2
三行目:n$1- → $1-
四行目:n$1 → $1

これで動作異常とか出ることないですか?
0427nobodyさん2006/05/14(日) 02:24:08ID:???
read.cgiっつーと、nがあるか無いかは>>1を表示するかしないかのただのオプションじゃないか?
0428nobodyさん2006/05/14(日) 02:26:46ID:???
>>426
抜いて問題があるかないかと言えば、抜いたら問題があるから入っているんでしょうとしか言えないです。

そもそも、何でnを抜きたいのでしょう?
見た限り、パラメータとして掲示板の投稿No.をn1〜n10みたいに示すためのnのようですが、
受ける側の処理もそれに合わせて書き直せばnを抜こうが何だろうが大概動きますよ。
0429nobodyさん2006/05/14(日) 02:31:02ID:???
>>426
おれたちはデバッガーかよ・・・
0430nobodyさん2006/05/14(日) 02:31:40ID:???
レスどんもです。

>>427
なぜかn抜いても1見えますです。

>>428
抜かなかったら、ソース見たとき変な現象がおきるです。
たとえばこんな感じに。
<a href="../test/read.cgi/php/1146042050/n2-10" target="_blank"><a href="../test/read.cgi/php/1146042050/2-10" target="_blank">>>2-10</a>
<a href="..">が二個連続で表示されて、その片方にnを含むのが出ますです。
ちなみに、n消したら二個連続の表示ではなくなりますた。
■ このスレッドは過去ログ倉庫に格納されています