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

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

レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん2006/06/26(月) 00:46:38ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0951nobodyさん2006/07/25(火) 12:13:12ID:???
> そもそも時間がたてば普通にkillされるし。
0952nobodyさん2006/07/25(火) 12:17:22ID:???
最初の起動はコマンドラインから叩けばいい
あとは時間チェックとスリープ組み込んだ無限fork
絶対怒られるけど。
0953nobodyさん2006/07/25(火) 12:32:25ID:???
>>952
失敗するとゾンビが腐るほどたまったりするからなw
0954nobodyさん2006/07/25(火) 13:25:59ID:???
http://sourceforge.net/project/showfiles.php?group_id=74976
qmHandle って最新Ver1.2.0でDecember 10, 2003なんだけど、
今だったらもっといいスクリプトとかあるかな?教えてエロイひと
0955nobodyさん2006/07/25(火) 13:55:36ID:???
>>948
ィ`w

@list って配列他に使わないのであれば、<FH> するより一気に read した方がいいよ、ってことかな。
0956nobodyさん2006/07/25(火) 13:59:10ID:???
うちの環境では<FH>の方がreadより若干速い。
0957nobodyさん2006/07/25(火) 14:00:52ID:???
>>956
1行1行読む <FH> でのこと? うそやろ・・・(´・ω・`)
0958nobodyさん2006/07/25(火) 14:53:00ID:???
ファイルを何らかのマーカー(一般には改行文字)で区切って読み込む場合

open FH, 'example.data';
my @list = <FH>
foreach( @list ){
処理
}

より

open FH, 'example.data';
while( <FH> ){
処理
}

のほうが一般に高速、メモリの使用量も少ない。
前者はファイルに保存してある情報を全てメモリ上にぶちまけた上でその情報を使って処理するのに対して、
後者はそのときの処理に必要な部分のみをファイルからメモリに読み取って処理を行う。

ディスクアクセスのキャッシングは OS がシステム全体の状況に応じて行ってくれるので
間欠アクセスによるシークロスは気にする必要は無い。
0959nobodyさん2006/07/25(火) 14:57:44ID:???
>>892
use encoding qw(euc-jp);
use Encode qw(from_to encode decode);

my $str = "%C6%FC%CB%DC";
$str =~ tr/+/ /;
$str = encode("utf8", $str); # utfフラグを落とす
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
from_to($str, "euc-jp", "utf8"); # 変換
$str = decode("utf8", $str); # utfフラグを付ける
print $str;

でだめなん?
0960nobodyさん2006/07/25(火) 16:17:48ID:p7nXlRS6
アップローダーを作成したのですが、15M程度のファイルなら
問題なくアップできるのですが、100M近いものになると
「ページを表示できません。検索中のページは現在、利用できません。
Web サイトに技術的な問題が発生しているか、ブラウザの設定を調整
する必要があります。」
のエラーが発生してしまいます。
CGIでのファイル制限は設けていないのですがこのような症状になって
しまいます。どなたかご存知の方ご教授お願い致します。
0961nobodyさん2006/07/25(火) 16:28:28ID:???
timeoutとか
0962nobodyさん2006/07/25(火) 16:42:24ID:???
>timeoutとか
timeoutはアップの途中でも起こることなのでしょうか?
もしそうだとしたらtimeoutを防ぐ(ごまかす?)手段などはありますか?
0963nobodyさん2006/07/25(火) 16:50:00ID:???
レン鯖デバッガーかよ。しかもIEの簡易エラー表示なんてもってのほか。
0964nobodyさん2006/07/25(火) 17:04:06ID:???
>しかもIEの簡易エラー表示なんてもってのほか
申し訳ありません。下記がログに残されているメッセージです。
CGI.pm: Server closed socket during multipart read (client aborted?).
0965nobodyさん2006/07/25(火) 17:20:00ID:???
>>964
CGI.pmが腐ってるんじゃないの
自分でparseしたら
0966nobodyさん2006/07/25(火) 19:41:41ID:???
>>965
おいおい
0967nobodyさん2006/07/25(火) 19:54:02ID:???
>CGI.pmが腐ってるんじゃないの

みたいに適当な初心者が

>自分でparseしたら

ですか。
お前にCGIモジュール以上のものが書けるのかと問いたい問い詰めたい、小一時間ほど。
どうせおまえ KEMT からコピペするだけと違うんかと。
っていうか server も close も socket も during ...も中学レベルの単語じゃねぇか。
0968nobodyさん2006/07/25(火) 20:00:23ID:???
富○県から引っ越すんだ!!
0969nobodyさん2006/07/25(火) 21:50:03ID:???
>>964
てことはクライアント側でなんか起こってるんじゃないの?
どうしてもだめならファイル自体分割するとか・・・
0970nobodyさん2006/07/26(水) 10:23:21ID:???
apacheなら入力出来るサイズをhttpd.confで増やす。
phpならphp.iniで入力サイズを増やす。
あと、perlならアップするファイルサイズの約二倍の物理メモリを。

そしてもう来るな
0971nobodyさん2006/07/26(水) 11:01:41ID:???
>>970
>そしてもう来るな
?
0972nobodyさん2006/07/26(水) 11:37:01ID:???
> あと、perlならアップするファイルサイズの約二倍の物理メモリを。

それはすごい perl ですね。
0973nobodyさん2006/07/26(水) 11:37:58ID:???
SJISから特定の文字列($target)を[16進]で置き換えたく以下の処理をしてるんですが、

sub change{
my ($in) = @_;
my $sjis_str = '[\x81-\x9F\xE0-\xF7\xFA-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF]';
my $target = '[\xF7][\x41-\x9B\xA1-\xFA]|[\xF9][\x41-\x9B\xA1-\xED]|[\xFB][\x41-\x8d\xA1-\xD9]';
$in =~ s/\G((?:$sjis_str)*)($target)/$1.'['.unpack('H4',$2).']'/ego;
return $in;
}

sjisとtargetがかぶってしまっています。$sjis_strから$targetを除くとどう表現できますかね?
文字コードテーブルはよーわからんヽ(+∇+)ノ
0974nobodyさん2006/07/26(水) 12:04:59ID:JkK9HWj1
2006724,hogehogehogeoegoegeg
2006723,akjhkadghjhgiower

Text::CSV_XSを使ってCSV形式で保存してます。
アクセスログなので結構膨大です。
日付別に分別したいのですが何かいい案はありますか?
ハッシュのキーに数字のみが使えたらよかったですが。無理ですし。
で、まあdateとかつけようと思ったのですが。
push @$hash{date$temp[0]},$csv->string();
みたいな。

なんかうまくいきませんね。グローバルシンボルじゃボケエラーがでますが。
もちろんmy宣言はしてるのです。問題なく。
でりふぁれんす部分がおかしいかキーの中のやり方がおかしいかですね。


09759742006/07/26(水) 12:13:15ID:JkK9HWj1
勘違いorz

push @{$hash{$temp[0]}},$csv->string();
で動いた。
っていうかperlってキーに数字のみも使えるのね。便利すぎ
0976nobodyさん2006/07/26(水) 12:13:57ID:???
まあ数字も文字なわけで・・・
0977nobodyさん2006/07/26(水) 12:32:06ID:???
awkの伝統?
09789742006/07/26(水) 13:52:08ID:JkK9HWj1
すいませんでした。

あれから色々と進めてカベにぶち当たってなんとか解決して。
でもイマイチなのでよりよい記述をアドバイス願います。

ループ処理をするときに
foreach(keys %hash){}
とやると$_に入りますが、これを$dateに入れたいのです。
今は
while(my($date,)=each %hash){}
としてますが、なんか不満が残る記述方法です。
もっとスマートなやりかたはないでしょうか。

それと連続ですみませんがもう一つ。
上記のやつでさらにkeyをsortしてから取り出したいのですが、each sort %hashだとエラーになってしまいました。
カッコもつけてみたのですがだめでした。これもできればスマートに・

宜しくお願いします。
0979nobodyさん2006/07/26(水) 14:23:02ID:???
my %hash = (
key1 => 'data1',
key2 => 'data2',
key3 => 'data3',
key5 => 'data5',
key4 => 'data4',
);
my $key;

print "Unsorted Result\n";
foreach $key ( keys %hash ){
print " $key\t$hash{$key}\n";
}

print "\n\nSorted Result\n";
foreach $key ( sort keys %hash ){
print " $key\t$hash{$key}\n";
}
09809742006/07/26(水) 14:28:07ID:JkK9HWj1
なるほど!
さっき試しに
while(my($date,)=keys %hash){}
してみたら無限ループでクラッシュするかと思いましたよ。

ありがとうございました。
09819742006/07/26(水) 14:32:56ID:JkK9HWj1
ところで無限ループにはいつもこまってるのですが、
せめて処理開始から1分が経過したら自動でexit()が発動するようなことはできないんでしょうか?
そうすればループが無限してもパソコンは安心ですよね。
0982nobodyさん2006/07/26(水) 14:55:54ID:???
無理ざます。そんなのあったらとっくに広まってるざます。
だからみんな危ないかなってときはループが一定回数を超えたら処理をエラーメッセージと共に
処理を中断させるんざます。
0983nobodyさん2006/07/26(水) 15:07:27ID:???
プログラム開始時にアラームでもセットすれば?
0984nobodyさんNGNG
出来るよ
0985nobodyさん2006/07/26(水) 15:39:28ID:???
SpiderMonkeyのJS_SetBranchCallbackみたいなのってないの?
0986nobodyさん2006/07/26(水) 15:52:09ID:???
>>981
普通にできるよ。

>>982
(ry
09879742006/07/26(水) 16:04:23ID:JkK9HWj1
http://perl.misty.ne.jp/function01/alarm.html

ここ読んでalarmが何かを理解しようと思いましたが、どうやら他にも理解しないといけないことがあるようで。
実行中のプロセスにSIGALARMシグナルをおくられてもね・・・

どっかで受け取る処理をするのか?
そのシグナルがきたら発動するようにできるのか?

そこらへんをこのサイトも書いてくれてたら・・・・
でもこのサイト質問すると答えてくれる。最高な管理人だからこんなこと言うの恐縮だ
0988nobodyさんNGNG
( ゚д゚)ポカーン
09899742006/07/26(水) 16:16:59ID:JkK9HWj1
m(__)m
0990nobodyさん2006/07/26(水) 17:29:19ID:???
>>987
そこに受け取る処理も何も全部書いてあるんだが。
それ読んで分からなければ、perldoc -f alarm 読んでも分からんだろうな…。
基本的に同じ事が書いてあるから。
0991nobodyさん2006/07/26(水) 20:29:14ID:???
>>973
(?:$sjis_str)* のとこを (?:$sjis_str)*? にしてみてわ?
ってか >>973 の場合 \G いらないと思うんだけど。
0992nobodyさん2006/07/27(木) 09:50:11ID:1uzwaimq
trust::error_print() if $form{test} =~ /\D|\d{2}/;

中身に数字以外を含むか、数字だけでも1桁でなければ
エラー分を出力してexitするルーチンを呼びたいのですが、
上記で穴は完全にふさげてますでしょうか?
0993nobodyさん2006/07/27(木) 10:14:26ID:???
無限ループの例
for ( $i=0; $i<0; $i++ ) {
print $i;
}
このプログラムでは、初期値を0に設定してループごとに1足していっているのですが
終了の条件が 「0未満になった場合」 となっています。
0から1づつ足していってるので、「0未満」 となるはずもなく、0からの数字が延々と表示され続けます。


↑これって本当ですか?forの条件式部分って確かifと同じでしたよね。
だから0未満であれば実行するんであって、0未満でない上記の場合は一度も実行しないはずですが。

私が間違ってますか?
0994nobodyさん2006/07/27(木) 10:52:50ID:???
> ↑これって本当ですか?forの条件式部分って確かifと同じでしたよね。
大嘘。そんなこと言ってる奴は葬ってしまう事が社会正義なので晒してください。
09959932006/07/27(木) 11:10:17ID:???
>>994
色々勉強させてもらったサイトなのでご勘弁をm(__)m
回答ありがとうございました。失礼します。
0996nobodyさん2006/07/27(木) 11:26:26ID:???
my %test = qw/a 1 b 4 c 2/;
これを値の数値が小さい順に並べ替えたいのですがsどうやればいいでしょうか。
0997nobodyさん2006/07/27(木) 11:31:29ID:???
my %test = qw/a 1 b 4 c 2/;
my @row = sort{$test{$a} <=> $test{$b} }keys %test;
print @test{@row};

なんか知らないけど試してたら偶然カスリました。
ここから後は自分でいけそうです。996でした。
0998nobodyさん2006/07/27(木) 11:43:39ID:???
>>995 もう遅い。
http://perl.misty.ne.jp/04.html#e
0999nobodyさん2006/07/27(木) 11:52:44ID:???
@a = qw/1 2 3 4 5 6 7 8 9/;
print $a[int rand @a];

これでそれなりに全てが平等に抽選できてますかね?
1000nobodyさん2006/07/27(木) 12:13:11ID:???
>>999
バ〜カ
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。