Perlコーディング初心者質問スレ Part 50
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん
2006/06/26(月) 00:46:38ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0839nobodyさん
2006/07/21(金) 12:17:55ID:???ttp://www.din.or.jp/~ohzaki/perl.htm#httpURL
まあここまでやらなくてもいいと思うが
0841nobodyさん
2006/07/21(金) 12:25:52ID:???とよくバカにされるんですが、どうしたら良いでしょうか?
0842nobodyさん
2006/07/21(金) 12:30:03ID:???スレ違い、そしてその人は無知
ttp://www.kanzaki.com/docs/html/htminfo-uri.html#uri
ttp://www.alib.jp/html/uri.html
0843nobodyさん
2006/07/21(金) 12:31:22ID:???0844nobodyさん
2006/07/21(金) 12:59:56ID:???0845nobodyさん
2006/07/21(金) 15:15:48ID:???--ここから--
my $param = '123a456';
my $n = '';
for (;;) {
$param =~ s/[0-9]+//;
$n = defined($&) ? $& : '';
print 'debug $n='.$n.' $parm='.$param."\r\n";
last if ($n eq '') ;
}
print 'end';
--ここまで--
とりあえず for(;;0) のように第三パラメータになんでもいいから
突っ込めば $& が再評価されてループを抜けるのはわかったが、Bad
Know-How くさいので正しいコードを誰か教えて。
0846nobodyさん
2006/07/21(金) 15:33:56ID:bw5ViySCというのを正規表現で書くとどうなりますか?
0847nobodyさん
2006/07/21(金) 15:36:13ID:???こうやったけどこうなってできませんでした、とか
0848nobodyさん
2006/07/21(金) 15:39:23ID:???$&はThe string matched by the last successful pattern match なので
マッチしなくて置換が行われなかったときに値が変わるのを期待する方が
危険な気がする。s///は置換に成功したかどうかを返すのでそれで分岐
するのが筋じゃないかと。
forの第三パラメタがあったときに値が変わるほうがむしろ不思議だな。
どっちにしろ成功したパターンマッチのすぐ後以外のところでマッチ関係の
変数($<数字>とか$&とか)を使うのは怖いので自分ならしない。
0849846
2006/07/21(金) 15:49:32ID:bw5ViySC$moji =~ s/ / /g;
my ($temp undef) = split(/ /,$moji);
0850845
2006/07/21(金) 16:05:32ID:???サンクス
$& はマッチしなかった場合 undef になるというのをどっかで読んだんだが。
defined($&) の条件分岐はしないほうがいいてこと?でも for(;;0)のときには
ちゃんと評価されるのが謎なんだよな。
0851nobodyさん
2006/07/21(金) 16:08:33ID:???perl -MO=Deparse foo.plで for(;;) とfor(;;1)を比べてみたが、
for(;;)の方は単純に
while(1) { ... }
になるのに対して、for(;;1)の方は
while (1) { do { ... }; '???'; }
となってループ内の実行文がdo ブロックの中に入るかたちに
なっていた。このためfor(;;)の方では最後に成功したマッチが
456の置換になるのに対して、for(;;1)の方ではこのループに入る
前(一度もないのでundef)になるのだろうと思われる。
ちなみに、プログラムの先頭に 'hoge' =~ /.*/; を追加して
for(;;1)を試すと3回目からhogeになる。
0852845
2006/07/21(金) 16:35:45ID:???my $param = '123a456';
my $n = '';
while (1) {
last unless ($param =~ s/[0-9]+//);
$n = $&;
print 'debug $n='.$n.' $parm='.$param."\r\n";
}
print 'end';
0853nobodyさん
2006/07/21(金) 17:08:27ID:???my $param = '123a456';
my $n = '';
while ($param =~ s/[0-9]+//) {
$n = $&;
print 'debug $n='.$n.' $parm='.$param."\r\n";
}
print 'end';
0856nobodyさん
2006/07/21(金) 18:49:30ID:???s/\s.*//; かな? split を使うなら、第三引数に1がいいかも
>>853
my $param = '123a456';
while ($param =~ s/([0-9]+)//) {
print 'debug $n='.$1.' $parm='.$param."\r\n";
}
$& を使うと全体が遅くなるから、キャプチャした方が良くない?
0857nobodyさん
2006/07/21(金) 19:06:38ID:???0858nobodyさん
2006/07/21(金) 20:22:51ID:???余程凄いもん作るわけ?
俺はちょくちょく書き換えるから最適なコードなんて求めない。
早く仕上げることの方が面白いしね。
漫画みたいにズダダダダダーって物事を進めていくのが面白いんだよ。
っていうか画像サイズとかをかんぺきにするだけでじゅうぶんだそ。
0859nobodyさん
2006/07/21(金) 20:47:36ID:???0860nobodyさん
NGNG0863nobodyさん
2006/07/22(土) 01:07:15ID:???0864nobodyさん
2006/07/22(土) 01:25:10ID:???0866nobodyさん
2006/07/22(土) 05:06:31ID:???foreach $test (@test){
print "$test";
}
と
foreach $test (@test){
$test .= $test;
}
print "$test";
とではどちらが鯖負担の軽減、高速化になりますか?
0867nobodyさん
2006/07/22(土) 05:30:37ID:???上。だってやってること違うじゃん。
foreachよりforの方が速いから、上の方のもっと速くするには
for(@test){
print;
}
0868nobodyさん
2006/07/22(土) 05:33:09ID:???agroupeの要素がbgroupeに含まれていれば、ok!と出力し、
入っていなければ、その要素を出力するスクリプトがうまくいきません。
@agroupe=qw(quit exit login logout);
@bgroupe=qw(exit quit);
for(@agroupe){
if(grep(/^$_$/,@bgroupe)){
print "ok!\n";
} else{
print $_, "\n";
}
}
これでやると全部入っていることになっちゃうんですが、どこが間違ってるでしょうか。
0869nobodyさん
2006/07/22(土) 05:40:00ID:???@agroupe=qw(quit exit login logout);
@bgroupe=qw(exit quit);
for my $word (@agroupe){
if(grep(/^$word$/,@bgroupe)){
print "ok!\n";
} else{
print $_, "\n";
}
}
0870nobodyさん
2006/07/22(土) 05:43:37ID:???@agroupe=qw(quit exit login logout);
@bgroupe=qw(exit quit);
my %bgroupe = map { $_ => 1 } @bgroupe;
for (@agroupe){
if(exists $bgroupe{$_}){
print "ok!\n";
} else{
print $_, "\n";
}
}
0871nobodyさん
2006/07/22(土) 05:47:20ID:???ありがとうございます。
そうか、grepの場合、$_にはそのループのデフォの$_じゃなくて
比較対象の要素が入ってるんですね。前も引っかかったのに忘れてて
小一時間損したぁぁ。
ちなみに
if(grep(/^$word$/,@bgroupe)){
print "ok!\n";
} else{
print $word, "\n"; # print $_, "\n";だと何も出てこない!
}
0873nobodyさん
2006/07/22(土) 09:05:18ID:???本当にそのコードなんだったらチェックは付かない。
しかし実際は、そのコードからは出力されるはずのない
<tr><td><input type=checkbox name=chk1 value=1 checked></td><td>洗顔</td></tr>
という行が出力されている。(checkedの部分が問題
つまり
print "<tr><td><input type=checkbox name=chk$cnt value=1";
print "></td><td><b>$_</b></td></tr>\n";
の2行の間に「すでにチェックされたかどうか」を判定するコードが実際には入ってると考えられる。
その部分のコードを削除すればたぶんOK
0874nobodyさん
2006/07/22(土) 17:39:40ID:???my $foo = "hoge";
print "$foo";
みたいに文字列を無駄なダブルクォートで囲う人が居なくなって欲しい。
>>866 みたいなやつ。
ダブルクォートで囲うと新しい文字列を作る事になるから
上のような場合は、ただの無駄にしかならない
($fooと全く同じ文字列を作って表示している)。
一体、どこで習ってくるんだろう。
KENTもそこまで酷くないよね?
0875nobodyさん
2006/07/22(土) 17:41:47ID:???0876nobodyさん
2006/07/22(土) 18:08:55ID:???$fooと同じ文字列をわざわざ作るなんて馬鹿なコンパイラはない。
0877nobodyさん
NGNG0878nobodyさん
2006/07/22(土) 18:50:39ID:???$ perl 876.pl 2>/dev/null
Benchmark: timing 1000000 iterations of bare, quote...
bare: 2 wallclock secs ( 0.78 usr + 0.53 sys = 1.31 CPU) @ 762776.51/s (n=1000000)
quote: 1 wallclock secs ( 0.96 usr + 0.56 sys = 1.52 CPU) @ 657030.22/s (n=1000000)
$ cat 876.pl
use Benchmark;
my $foo = 'bar';
timethese(1_000_000,
{'quote'=>sub {print STDERR "$foo";},
'bare'=>sub {print STDERR $foo;},
});
0879nobodyさん
2006/07/22(土) 18:55:33ID:???魅力のひとつだと思う・・・
0880nobodyさん
2006/07/22(土) 19:40:53ID:???Benchmark: timing 1000000 iterations of bare, quote...
bare: -1 wallclock secs ( 0.11 usr + 0.00 sys = 0.11 CPU) @ 9090909.09/s (n=1000000)
(warning: too few iterations for a reliable count)
quote: -1 wallclock secs ( 0.20 usr + 0.00 sys = 0.20 CPU) @ 5000000.00/s (n=1000000)
(warning: too few iterations for a reliable count)
$ cat 876.pl
use Benchmark;
my $foo = 'bar';
timethese(1_000_000,
{
'quote'=>sub {$boo="$foo";},
'bare'=>sub {$boo=$foo;},
});
printしないとこんなかんじ
0881nobodyさん
2006/07/22(土) 21:43:50ID:???"" で括るのは、新しい文字列の生成という意味だから、最適化はされないよ。
-MO=Deparse 付けてみても、"$foo" そのまま。
0882nobodyさん
2006/07/23(日) 01:44:22ID:NrRWf3Mx「Perl・CGIコーディング初心者質問スレ」
に変えるべきだと思う。
0883nobodyさん
2006/07/23(日) 01:46:04ID:BeERA3x6念のため言っておくけどハッシュにすると遅いよ。
可読性があがるからコーディングが早いってだけ
でもハッシュ使っとけ
0885nobodyさん
2006/07/23(日) 02:19:16ID:???速さを求めたいならはじめに両方の要素をソートしておくことをお勧めする。
もちろんそれに応じたコーディングも必要だが要素数が多ければ目に見える効果があるはず。
0886nobodyさん
2006/07/23(日) 03:06:54ID:???if ($ENV{'PERLXS'} eq "PerlIS") {
print "HTTP/1.0 302 Temporary Redirection\n";
print "Content-type:text/html\n";
}
という記述があったんですが意味がよく分かりません。
分かる人、翻訳お願いできませんか?
0887nobodyさん
2006/07/23(日) 03:31:22ID:???検索したらすぐに解ったが…
ttp://www.att.or.jp/perl/faq/perlwin32faq/perlwin32faq7j.html#My_CGI_scripts_don_t_seem_to_run
ttp://www.att.or.jp/perl/faq/perlwin32faq/perlwin32faq7j.html#How_does_my_script_know_if_it_s_
「ISAPIで実行されていたらステータス行とContent-Typeヘッダ吐き出せ」
0888886
2006/07/23(日) 03:35:53ID:???すみません。まさか検索で引っかかるとは思いが至らず・・・。
要は削除してしまっても問題ない箇所なんですね。
こんな時間にありがとうございました。
0889nobodyさん
2006/07/23(日) 03:44:25ID:671DuE1Hうざいよ、藻前。
>my $foo = "hoge";
>print "$foo";
>みたいに文字列を無駄なダブルクォートで囲う人が居なくなって欲しい。
上のは必要。下のは"$foo\n"が普通なので必要。ちなみに$foo,"\n"より速い。
0890nobodyさん
2006/07/23(日) 11:48:54ID:???>上のは必要
お前、何当たり前の事言ってんだ…。
>下のは"$foo¥n"が普通なので必要
コード違うじゃん。誰が改行付ける時の話してる?
0891nobodyさん
2006/07/23(日) 11:56:10ID:???0892nobodyさん
2006/07/23(日) 12:16:20ID:rog/ar/Gperl-5.8.8で、URLエンコーディングのデコードをやりたいと思っています。
以下の様にやってみました。
use encoding "euc-jp";
$str = "%C6%FC%CB%DC";
$str =~ tr/+/ /;
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
print $str;
が、何も出力されません。
use encoding "euc-jp" を除くと正しく出力("日本")されるのですが、
この部分は入出力の関係上できればのこしておきたいと思っています。
どうしたら解決できるか、どなたかお分かりの方教えてください。
0893速さ順
2006/07/23(日) 13:08:12ID:???"$foo\n"
$foo,"\n"
こんな感じか?それなら文字列連結でいいんじゃね
0894nobodyさん
2006/07/23(日) 13:30:13ID:???これじゃだめなの?
use encoding "euc-jp";
{
no encoding;
$str = "%C6%FC%CB%DC";
$str =~ tr/+/ /;
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
}
print $str;
0895nobodyさん
2006/07/23(日) 14:44:30ID:???なんかこないだから一人ずれてるのいるよね・・・。
>>892 がなんで use encoding 下でダメなのか説明おねがいえらいひと。
0896ヽ(´ー`)ノ ◆.ogCuANUcE
2006/07/23(日) 17:23:10ID:???解決法は >>894、もしくは use encoding を使わない。
理由は perldoc encoding の DO NOT MIX MULTIPLE ENCODINGS のあたりを参照。
use encoding "euc-jp";
my $str = '%C6%FC%CB%DC';
print "before: $str (" . length($str) . ")\n";
$str .= "\xFE";
print "after : $str (" . length($str) . ")\n";
use encoding については、作った本人が「使うな」と言ってる上に、
副作用が多すぎる。
新規で書くコードに関しては、Encode.pm で適宜変換するようにして、
文字リテラルには ascii しか書かないか、use utf8 をして utf-8 に
統一してしまうかの、どちらかを選択するべき。
古いコードで use encoding しているものは、no encoding で逃げるか、
駄目なら書き直すべし。
知ってる人間が use encoding 使ってたら、確実に殴る。
0897nobodyさん
2006/07/23(日) 17:35:06ID:???unko
HOGEHOGE
これの << ってなんだっけ
名称をどわすれした
0898nobodyさん
2006/07/23(日) 17:51:27ID:???0899nobodyさん
2006/07/23(日) 18:45:27ID:???ああ、そうか。 なるほどねー。
use encoding "euc-jp"; 下では
$str = "\xc6";
$str .= "\xfc";
$str .= "\xcb";
$str .= "\xdc";
こう書いても $str は "日本" ってはならないわけだな。 ic ic
0900nobodyさん
2006/07/24(月) 01:13:30ID:ga9J27XZ0901nobodyさん
2006/07/24(月) 02:23:23ID:???0902nobodyさん
2006/07/24(月) 10:35:48ID:78lGpjq9open FH,"+>>test.log";
seek FH,0,0;
print FH "$time","\n";
close FH;
test.logの先頭に一行新しく入れたいのですが、これだと末尾に一行追加されます・・・・
多分+>>のせいだと思いますが、先頭に入れようとしたら、
my @list=<FH>;
truncate FH,0;
print FH $time,"\n";
print FH @list;
とするしかないのでしょうか?
なんかいちいち一旦全部配列に入れてファイルを消してってのが嫌です。
0903902
2006/07/24(月) 10:39:56ID:78lGpjq9seek FH,0,0;
がないと@tempに何も入りませんね。
しかしなんでそこでのseekは効くのに、前者の方ではうまくいかないんだろう
0904902
2006/07/24(月) 11:25:03ID:78lGpjq90905nobodyさん
2006/07/24(月) 11:51:01ID:???0906nobodyさん
2006/07/24(月) 11:56:03ID:???こういうフォーマットの文字列を
11時53分11秒
に変換したいです。
なるべく短い記述ですませいたいのですが。
できれば2バイトずつで自動スプリットできればそのままsprintfに渡せるのですが。
substrを3個も書いてsprintfに渡すのはなえますよね。
0909nobodyさん
2006/07/24(月) 12:23:35ID:???>>907
そういえば正規表現でいけましたね。ありゃ()がミソでしたね確か。
396は本当になるほど!って感じです。
unpackはまるで使いこなせていないままでしたが便利なものですねこれ。
0910905
2006/07/24(月) 12:35:23ID:TyNTrbq3↑は見つけましたが1年ほど前なので、他にありますでしょうか?
0911nobodyさん
2006/07/24(月) 13:02:47ID:???基本的に内容消さないで最初の行に追加する方法は無いと思う。
解決法としては、逆に、使うときに、my @list = reverse <FH>;
とか、foreach(reverse <FH>)
とかするとか、・・・
0912nobodyさん
2006/07/24(月) 13:16:16ID:???0913902
2006/07/24(月) 13:20:39ID:78lGpjq9あきらめス。
ありがとうございす。
0914nobodyさん
2006/07/24(月) 15:16:26ID:???馬鹿、またそうやって全部メモリに読み込んで。
しかも foreach でもう一度展開して。
勘弁してくれ。
>>913
http://perldoc.jp/docs/modules/File-ReadBackwards-1.02/ReadBackwards.pod
>このモジュールはファイルを行単位で逆方向に読み込みます。
>使い方は簡単で、メモリの使い方は効率的で高速です。
>オブジェクトとtieされたハンドル・インターフェイスの両方を
>サポートしています。
使わない理由は無い。
0915nobodyさん
2006/07/24(月) 16:33:06ID:???正直メモリ展開とか実感できない・・・1ミリ秒か100ミリ秒かとか体感違いないので・・・
昔のコンピュータを使ったこと無いってのもあるかも・・・
0916nobodyさん
2006/07/24(月) 16:40:34ID:???cとかで実装するかなぁ・・・と思う、・・・(今のとこそういうプロジェクトの予定無し・・・
個人的にforeach(reverse <fh>){.....}なんかは見やすいのでがんがん使う。
まあ、遅いって言ってもせいぜい多項式オーダーの遅さだと思うので、あまり気にしない
指数オーダーだったら大変だが・・・w
0917nobodyさん
2006/07/24(月) 16:58:47ID:???my @list=<FH>; はよろしくないけどw
0918nobodyさん
2006/07/24(月) 18:27:39ID:LY53xScL↑のように、パッケージファイル(List.pm)を更新しても、Webページで反映されません。
.cgiを持つ拡張子のファイルは反映されます。
これはどのようなことが原因ですか?
どのようにすればList.pmで書き換えた内容の更新が反映されるようになりますか?
0919nobodyさん
2006/07/24(月) 18:44:08ID:???んな訳ない
0920nobodyさん
2006/07/24(月) 18:46:52ID:???0921nobodyさん
2006/07/24(月) 18:58:52ID:???0922nobodyさん
2006/07/24(月) 19:16:35ID:???0923nobodyさん
2006/07/24(月) 19:24:17ID:???0924nobodyさん
2006/07/24(月) 19:40:51ID:???0925nobodyさん
2006/07/24(月) 19:46:47ID:???テンポラリファイル作って一行出力してから元ファイルから残りを追記後
リネームでもできるけど一緒にロックせにゃならんし残った後のこともあるな。
>>906
substr($str,0,2),substr($str,2,2),substr($str,4,2)
でもできるだろう。数字と判定してからのほうがよいと思うけど。
0927nobodyさん
2006/07/24(月) 20:13:17ID:???$date = "115311";
$date =~ s/(\d\d)(\d\d)(\d\d)/$1時$2分$3秒/;
0928nobodyさん
2006/07/24(月) 20:49:14ID:???0929nobodyさん
2006/07/24(月) 20:53:25ID:???0930nobodyさん
2006/07/24(月) 21:09:27ID:???0931ヽ(´ー`)ノ ◆.ogCuANUcE
2006/07/24(月) 21:16:05ID:???残念ながら、標準では入ってないが。
0933nobodyさん
2006/07/24(月) 22:22:30ID:IKH596diYY-BOARDを使っていますが最近英語の荒らし書き込みが増えちゃって困っています
そこで相談したところ「半角のみの投稿を禁止すればよい」という話を
聞いたのですが実際にスクリプトを変更する技術がなく出来ませんが
どなたか実際に使っている方などいたりしませんか?
アドバイスよろしくお願いいたします。
0934nobodyさん
2006/07/24(月) 22:46:14ID:???KENT WEB総合スレへドゾ。改造方法もあるでよ。
http://pc8.2ch.net/test/read.cgi/php/1078991985/450-
0936nobodyさん
2006/07/24(月) 23:59:23ID:cgyCzAHv見つけた内容は行いたい処理とは違う物しか発見できませんでした。
どなたか、下記の内容について処理方法を概要だけでも結構ですので
ご教授お願い出来ないでしょうか?宜しくお願い致します。
----
HTML内のフォームからファイルと時間を選択させて、
その時間になったら自動で指定ファイルをFTPで別サーバー
へ移動するという処理は可能でしょうか?
Perlでcrontabに書き出すことができればと思いましたが
レンタルサーバーでそれは許可されておりません。
cronを使用せずにperlにより指定時間になっているかどうかを
チェックして時間になっていたらFTPでファイルを移動
するような処理は可能なのでしょうか?
0937nobodyさん
2006/07/25(火) 00:19:33ID:???この場合プログラムが能動的に動くことは不可能。
ただスクリプトがアクセスされたときに指定時間になっているかをチェックすることは十分可能。
ほかはperlの機能としては全て可能だが、サーバーにより制限がかかっている場合もある。
0938nobodyさん
2006/07/25(火) 00:30:15ID:???レス数が900を超えています。1000を超えると表示できなくなるよ。