[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 06/02 01:51 / Filesize : 211 KB / Number-of Response : 664
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:nobodyさん mailto:sage [2011/09/09(金) 18:11:49.71 ID:???]
Perlのコーディングで困ってる人のスレです。

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

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

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

お勧めサイトは >>2 以降

前スレ hibari.2ch.net/test/read.cgi/php/1295170172/

78 名前:71 [2011/09/22(木) 16:01:22.71 ID:nJD1QeKS]
>>77
ありがとうございます。
あと、条件を複数指定する場合にどう記述すれば良いかだけ教えていただければ
十分なのですが…。
$Keyword = "●○" "●▲" "××";

$Keyword = "●○" AND "●▲";
  でしょうか?

それとも $Keyword = "●○","●▲";





79 名前:nobodyさん mailto:sage [2011/09/22(木) 16:13:15.01 ID:???]
うーん
COBOLをやってたというのがよく伝わってくる思考だw

$Keyword は GetData で

if (/$Keyword/){

というふうに正規表現で使われてるから論理演算子は使えないと思われ
$Keyword を @Keyword にしていっぱい入れられるようにして正規表現で | を使うか
if じゃない関数を使うかじゃないかな〜

80 名前:nobodyさん [2011/09/22(木) 18:12:10.54 ID:5FtK50r8]
読み込んで表示だけのページ=ロックの必要はない

読み込んだデータを更新して書き込むページ=
ファイルロック1
ファイル読み込みモードでオープン
ファイルを配列に読み込み
ファイルを閉じる

データ更新

ファイル書き込みモードでオープン
更新したデータをファイルに書き込む
ファイルを閉じる
ファイルロック1の解除

これでいいはず
仮に読み込んで表示だけのページを
ファイルロック1
ファイルを読み込みモードでオープン
データを配列に入れる
ファイルを閉じる
ファイルロック1の解除とすると
表示するだけのページを開く間は書き込みができなくなるから
そうすると書き込める隙がなかなかない

81 名前:nobodyさん [2011/09/22(木) 19:43:11.98 ID:7t8BkGQU]
use strict;
use warnings;

my @city = ("東京", "大阪", "名古屋");
delete($city[0]);
print "@city";

こんな簡単なので Use of unitialized value in join or string at *** line 6. っていう警告が出たんですが、どうしてですか?
それに Use of unitialized ... というエラーしょっちゅう見かけますが、調べてみてもよくわかりませんでした。
教えてくださいm(_ _)m

82 名前:nobodyさん mailto:sage [2011/09/22(木) 19:52:11.16 ID:???]
delete $city[0]; で undef になった $city[0] を print するのに使ったから

とりあえずexcite翻訳から初めてみたらどうでしょうか

83 名前:nobodyさん mailto:sage [2011/09/22(木) 20:01:45.61 ID:???]
>>81-82
perldoc.jp/docs/perl/5.10.0/perldiag.pod

84 名前:nobodyさん [2011/09/22(木) 20:15:05.37 ID:7t8BkGQU]
>>82-83
ありがとうごさいます。
@city = grep($_ ne "", @city);
で $city[0] を消しても残ってたので不便な関数だなと思いました。
undef の値を消すような操作をすればいいんですね。

85 名前:nobodyさん mailto:sage [2011/09/22(木) 20:16:16.72 ID:???]
つshift

86 名前:nobodyさん mailto:sage [2011/09/22(木) 21:48:02.28 ID:???]
$city[0] = "東京" を削除して詰めちゃってもいい ($city[0] = "大阪" とずれていい) なら
shift @city;
要素をずらさずに $city[0] だけ消したいなら
$city[0] = "";



87 名前:nobodyさん mailto:sage [2011/09/22(木) 21:53:14.20 ID:???]
あれ、$city[0] = undef;とdelete($city[0]);って同じ?

88 名前:nobodyさん mailto:sage [2011/09/22(木) 22:07:16.08 ID:???]
>>87
perldoc.jp/func/delete
perldoc.jp/func/undef

89 名前:nobodyさん mailto:sage [2011/09/22(木) 23:43:44.90 ID:???]
delete が非推奨とか・・・splice で削除しろとか書いてあるけどさ、
巨大な配列に対して splice すると、すごく遅そう・・・

90 名前:nobodyさん mailto:sage [2011/09/22(木) 23:56:59.38 ID:???]
>>89
Perl処理系のソースを見ずに言うが、
そのへんはパフォーマンスがガタ落ちにならん程度にはうまいこと処理してるだろうと思う。

91 名前:nobodyさん mailto:sage [2011/09/23(金) 00:35:13.51 ID:???]
ん?配列の要素に対する delete が非推奨なのは別に問題ないっしょ?
delete $array[$n] は要素を削除するのではなくて、むしろ undef $array[$n] に近いんだから。

92 名前:nobodyさん mailto:sage [2011/09/23(金) 00:37:24.81 ID:???]
spliceは引数多くて邪魔くさい

93 名前:nobodyさん mailto:sage [2011/09/23(金) 00:38:06.92 ID:???]
>>89
誤読すんなよ。

(特殊挙動の切り詰めの事を想定してるなら別だが)
splice で対処しろってのは、要素を本当に削除するケースに関してだ。
@arr = 1 .. 5 ; => @arr = qw( 1 2 5 );

delete の代りなら、
splice @arr, 2, 2, (undef) x 2 なんてしなくても
@arr[2,3] = (undef)x2 ;なりの方法があろう。

94 名前:nobodyさん mailto:sage [2011/09/23(金) 01:21:24.31 ID:???]
8万の配列に長さ1の文字列を入れて、delete、undef、spliceでベンチマーク取ったけど、
spliceが一番遅かったけど大きな速度差は出なかった

95 名前:nobodyさん mailto:sage [2011/09/23(金) 01:24:44.39 ID:???]
>>94
あと1つか2つ桁増やしてよろしく。

96 名前:nobodyさん mailto:sage [2011/09/23(金) 07:44:14.40 ID:???]
use Benchmark qw( timethese cmpthese ) ;
cmpthese timethese ( undef, {
delete => sub{ my @arr = ARRAY ; delete @arr[ 99999 .. 999999] },
splice => sub{ my @arr = ARRAY ; splice @arr, 99999, 900000, (undef) x 900000 },
slice => sub{ my @arr = ARRAY ; @arr[99999 .. 999999] = (undef) x 900000 }
});
__DATA__
ARRAY => (q{x}) x 1000000
Benchmark: running delete, slice, splice for at least 3 CPU seconds...
delete: 3 wallclock secs ( 2.91 usr + 0.15 sys = 3.06 CPU) @ 2.94/s (n=9)
slice: 4 wallclock secs ( 3.17 usr + 0.14 sys = 3.31 CPU) @ 2.72/s (n=9)
splice: 3 wallclock secs ( 3.06 usr + 0.19 sys = 3.25 CPU) @ 3.08/s (n=10)
Rate slice delete splice
slice 2.72/s -- -8% -12%
delete 2.94/s 8% -- -4%
splice 3.08/s 13% 5% --

ARRAY => 1 .. 1000000
Benchmark: running delete, slice, splice for at least 3 CPU seconds...
delete: 3 wallclock secs ( 3.12 usr + 0.00 sys = 3.12 CPU) @ 12.82/s (n=40)
slice: 3 wallclock secs ( 3.02 usr + 0.01 sys = 3.03 CPU) @ 6.93/s (n=21)
splice: 3 wallclock secs ( 3.03 usr + 0.07 sys = 3.10 CPU) @ 9.35/s (n=29)
Rate slice splice delete
slice 6.93/s -- -26% -46%
splice 9.35/s 35% -- -27%
delete 12.8/s 85% 37% --




97 名前:nobodyさん mailto:sage [2011/09/24(土) 11:44:49.89 ID:???]
文字コードで分からないことがあるのでご教授お願いいたします。
(utf-8 でソースを書いています)


utf-8 の半角ア -> EFBDB1
utf-16 の半角ア -> FF71

utf-8 でソースを書いているのだから、print "0xEFBDB1" で半角アが出力されるだろうと思ったら、
print "0xFF71" でないと半角アが表示されませんでした。


98 名前:nobodyさん mailto:sage [2011/09/24(土) 16:12:39.72 ID:???]
cryptって絶対に復号化できないんですか?
パスワードをこの関数を使って暗号しようと思っていますが
この関数を使う上で欠点や注意点がありましたら教えてもらえませんか?

99 名前:nobodyさん mailto:sage [2011/09/24(土) 16:30:15.23 ID:???]
>>98
>>1
perldoc.jp/func/crypt

100 名前:nobodyさん mailto:sage [2011/09/24(土) 16:48:02.74 ID:???]
>>97
半角のイなら、0xFF72です。

101 名前:nobodyさん mailto:sage [2011/09/24(土) 18:00:52.20 ID:???]
>>97
0xは数値に対してなので、\xだと思いますが、\xは2桁までしか拾わないので、
3桁以上の場合は、{ }を使って\x{123}とする必要があります。

2桁の場合は(\x{00B1}としても2桁と解釈されます)、その値そのもののバイナリ
文字列となります。

print "\xEF\xBD\xB1";

これ↑は、UTF-8として解釈すれば「ア」を意味するバイナリ文字列です。
ただし、Perlがこれを文字列処理するときはISO 8859-1という文字コードの3文字
として扱います。

3桁以上の場合は、その値のUnicodeコードポイント(U+FF71)のテキスト文字列となります。
( Perlは、"\x{FF71}"を「ア」という1文字として扱う)

バイナリ文字列(=バイト文字列)とは、バイト単位で処理される文字列のことです。
テキスト文字列とは、文字単位で処理される文字列のことです。

102 名前:nobodyさん mailto:sage [2011/09/24(土) 18:01:21.98 ID:???]
>>99
リンクありがとう〜 とりあえずこれ使ってみることにします


103 名前:nobodyさん mailto:sage [2011/09/24(土) 19:43:27.75 ID:???]
>>101
ありがとうございます!

104 名前:nobodyさん mailto:sage [2011/09/26(月) 12:35:58.38 ID:???]
トリップを生成する仕組みなんですが、

if (length $handle_pass >= 12)
{
my $mark = substr($handle_pass, 0, 1);
if ($mark eq '#' || $mark eq '$')
{
if ($handle_pass =~ m|^#([[:xdigit:]]{16})([./0-9A-Za-z]{0,2})$|)
{
$GB->{TRIPSTRING} = substr(crypt(pack('H*', $1), "$2.."), -10);
}

文字列12バイト以上で、先頭が#または$の場合、
$handle_pass =~ m|^#([[:xdigit:]]{16})([./0-9A-Za-z]{0,2})$|を行なって
cryptによって生成していると思います。

しかし、$GB->{TRIPSTRING}や$1や$2をprintすると何も表示されません。
$handle_pass =~ m|^#([[:xdigit:]]{16})([./0-9A-Za-z]{0,2})$|では何を行なっているのですか?
教えてください。

105 名前:nobodyさん mailto:sage [2011/09/26(月) 12:55:07.21 ID:???]
>>104
関係ないけど、これ $ から始まる場合何もしてないよね

106 名前: ◆??? mailto:sage [2011/09/26(月) 13:01:10.88 ID:???]
>>104
##0123456789abcdefxx 形式のトリップキーかどうかのチェックだろ

>>105
>>104は書いてないけど実際はelseがある
2chでは今のところ単に予約としてとってあるだけらしいから???になるだけだけど



107 名前:104 mailto:sage [2011/09/26(月) 14:03:37.14 ID:???]
>>105-106
ご回答ありがとうございます。
もう一度正規表現を調べますので、
その後、質問させてください。


108 名前:104 mailto:sage [2011/09/26(月) 17:00:08.24 ID:???]
先頭が#で始まり16進数文字が16個連続し、
末尾は./0-9A-Za-zのいずれかが0個以上2個以下連続する。

ですよね?

#0123456789abcdefxxは真
#0123456789abcdefxxxは偽
#0123456789abcdefは真

#0123456789abcdefあ が偽なのは、なぜでしょうか?

また、[[:xdigit:]]の[]が二重でくくられている意味を教えてください。

109 名前:104 mailto:sage [2011/09/26(月) 17:01:58.51 ID:???]
すみません、書きこんで気づきましたが、

#0123456789abcdefも偽ではないのか?と思います。

110 名前:nobodyさん mailto:sage [2011/09/26(月) 18:06:25.07 ID:???]
あ は [a-zA-Z0-9] かどうか
f の後ろに続く判断が ? なのか + なのかで意味合いが変わってくるかと。

トリップキーの規格をもっかい調べてみればよいかと。

111 名前:nobodyさん mailto:sage [2011/09/27(火) 00:54:20.16 ID:???]
ファイルのロックはmkdirなどでロック用ディレクトリ
を作る方法は良く見かけますがディレクトリではなく
openでロック用ファイルを作るというのは問題があるんでしょうか?

112 名前:nobodyさん mailto:sage [2011/09/27(火) 01:02:44.10 ID:???]
rename とか mkdir はシステムコールを使ってるから、open より割り込まれる余地が少ない。

とかじゃなかったっけ?


113 名前:nobodyさん mailto:sage [2011/09/27(火) 01:31:29.84 ID:???]
>>111
www.din.or.jp/~ohzaki/perl.htm#File_Lock

今時 flock を使えない環境に出くわす事も稀だがな。
perldoc.perl.org/perlport.html#flock

114 名前:nobodyさん mailto:sage [2011/09/27(火) 02:07:22.29 ID:???]
モジュールを作ってて、そのモジュールの中では use utf8 とか、open(my $in, '<:utf8', '〜') とかしてます。

しかし use utf8 してないスクリプトから呼ばれた時には、これだと文字化けが起きてしまいます。
そのため use utf8 されていない場合にはフラグを落として返したいのですが、
モジュールを呼んだスクリプトで use utf8 されてるかどうか調べる方法はあるのでしょうか?


モジュールが特定の文字コードに依存すること自体が駄目だとは分かっては居るのですが・・・


115 名前:nobodyさん mailto:sage [2011/09/27(火) 04:57:52.69 ID:???]
>>112
余地が少ないんじゃなくて余地が無い、
つまり処理がアトミックでないとだめなんだよ。
「余地が少ない」んじゃ意味ないの。

116 名前:nobodyさん mailto:sage [2011/09/27(火) 11:02:16.14 ID:???]
flock(XX, 2)
でデッドロックが発生した場合はどうなるんでしょうか?
あと、待ってる間は自動でsleepしてくれるんでしょうか?

flock(XX, 6)
で自分で実装するのとどちらが良いのか迷ってます。



117 名前:nobodyさん mailto:sage [2011/09/27(火) 19:02:14.19 ID:???]
すいません。プログラムを定刻になると自動で実行するようにしたいんですが、できますか?
レンタルサーバに置きます。
全体を無限ループをしてsleep()で休むというのを考えたのですが、無限ループは一番やってはいけないらしいですね。

あと検索するとすぐJavaScriptで自動更新する方法が出てきますが、
この方法だと時限以外にもCGIにアクセスされたときに実行してしまうと思います。
JavaScriptだけに実行させたいときはパーミッションをどう設定すればいいですか?

118 名前:nobodyさん mailto:sage [2011/09/27(火) 19:46:39.67 ID:???]
>>116
>明白ではないものの、伝統的な flock の動作としては、ロックが得られるまで 無限に待ち続けるものと、単に勧告的に ロックするものの二つがあります。

>>117
cronのことを聞いてる?

119 名前:nobodyさん mailto:sage [2011/09/27(火) 21:07:32.00 ID:???]
>>118
その説明を読んで具体的にどうなるのかが分からなかった
伝統的とか無限とか

・複数のプロセスが待ち状態になった場合に、次にロックを得られる順番は?
・デッドロックかかったらプロセスはどうなるのか
・待ってる間の負荷は

この辺りが気になる。

120 名前:nobodyさん mailto:sage [2011/09/27(火) 22:48:37.67 ID:???]
・複数のプロセスが待ち状態になった場合に、次にロックを得られる順番は?
システムにしか分かりません

・デッドロックかかったらプロセスはどうなるのか
flock を待つオプションで呼び、他のプロセスが死ねばロックは外れるので先に進めますが、
mod_perlなどではプロセスは死なないのでflockは掛かったままになります。
なので、flockを呼ぶときは待たないようにしましょう

121 名前:nobodyさん mailto:sage [2011/09/27(火) 23:25:00.27 ID:???]
flock呼んだ順番になるのか、ランダムになるのかの2択くらいかと思ったんですが、後者って認識でいいです?

無限に待ち続けるとあるんですが、待たないようにする方法もあるんでしょうか?

あと、大量のプロセスが待ち状態になった場合の負荷も気になります。
大人しく待ってるんでしょうか?

122 名前:nobodyさん mailto:sage [2011/09/27(火) 23:54:57.99 ID:???]
unlock時に起き上がったプロセスがロックを取れる
LOCK_NBだ、ドキュメントぐらい読め
sleep以外に何をするのか、それ以前にロック待ちが大量にある時点でどうか

123 名前:nobodyさん mailto:sage [2011/09/28(水) 01:15:39.74 ID:???]
>>117
>>118 の書いているとおり通常はcronを使う。と思う。

> あと検索するとすぐJavaScriptで自動更新する方法が出てきますが、

「プログラムを定刻になると自動で実行」させるのにJavaScriptをどうやって使うの? 意味がわからん。

> JavaScriptだけに実行させたいときはパーミッションをどう設定すればいいですか?

さらに意味がわからん。

124 名前:nobodyさん mailto:sage [2011/09/28(水) 01:29:17.95 ID:???]
>>123
俺は最初、サーバサイドでjavascriptを動かすnode.jsのこと言ってるのかと思った。
cronを扱うためのapiもあるみたいだし。
perl関係ないけど。

125 名前:nobodyさん mailto:sage [2011/09/28(水) 02:00:23.29 ID:???]
>>122
ありがとうございました。
LOCK_NB使わずに待たない方法があると勘違いしてました。
素直に自分で実装します。

126 名前:nobodyさん mailto:sage [2011/09/28(水) 13:39:10.69 ID:???]
ファイルの読み書きでトランザクションを実現するモジュールを apache が標準で持ってくれるとありがたい



127 名前:nobodyさん mailto:sage [2011/09/28(水) 17:26:59.68 ID:???]
ファイルの読み込みは@lines = <IN>で一括して配列に入れていますが
while<IN>で1行ずつ読み込む方がいいんですか?
配列を引数にしたり戻り値にしたりする場合が多いから
どうしても一括読み込みが多くなってしまいますが
一括読み込みだとそんなにメモリの負担になりますか?

ていうか<IN>自体にもファイル全部のデータが格納されているんですよね?

128 名前:nobodyさん mailto:sage [2011/09/28(水) 18:31:25.70 ID:???]
GB単位でファイルを処理する人間だと、while で回すなりの工夫は必要だけど、
今のご時世だったら、殆どの人は気にする事は無いでしょ。

>ていうか<IN>自体にもファイル全部のデータが格納されているんですよね?
そんなスーパーな挙動を取られたら、5GBファイルを 2GB メモリの PC で解析
出来ないじゃないですかっ


129 名前:nobodyさん mailto:sage [2011/09/28(水) 21:17:17.61 ID:???]
一行づつ読み込んだら遅くなる。

130 名前:nobodyさん mailto:sage [2011/09/28(水) 22:32:03.45 ID:???]
% perl -le '$s = q{x} x 1000000 ; $s =~ s/(.{1,50})/$1\n/g; print $s ' > test.txt
% cat hoge.pl
use Benchmark qw( timethese cmpthese ) ;
cmpthese timethese ( undef, {
arr => sub { open my $fh, q{<}, q{test.txt} ; my @arr = <$fh> ; close $fh ; @arr },
whi => sub { open my $fh, q{<}, q{test.txt} ; my @arr ; while (<$fh>){ push @arr, $_ } close $fh ; @arr },
aho => sub { open my $fh, q{<}, q{test.txt} ; my @arr ; for (<$fh>){ push @arr, $_ } close $fh ; @arr },
});
% perl hoge.pl
Benchmark: running aho, arr, whi for at least 3 CPU seconds...
aho: 3 wallclock secs ( 2.76 usr + 0.35 sys = 3.11 CPU) @ 48.87/s (n=152)
arr: 3 wallclock secs ( 2.72 usr + 0.41 sys = 3.13 CPU) @ 56.55/s (n=177)
whi: 3 wallclock secs ( 2.85 usr + 0.30 sys = 3.15 CPU) @ 70.79/s (n=223)
Rate aho arr whi
aho 48.9/s -- -14% -31%
arr 56.5/s 16% -- -20%
whi 70.8/s 45% 25% --


131 名前:nobodyさん mailto:sage [2011/09/28(水) 22:55:36.32 ID:???]
>>130
コメントは大事だよー
whileが一番速いのか 理由は何なんだろうな

132 名前:nobodyさん mailto:sage [2011/09/28(水) 23:04:50.68 ID:???]
whileでファイルの2行目から読み込むのってどうやるんですか?

133 名前:nobodyさん mailto:sage [2011/09/29(木) 00:01:53.09 ID:???]
<FH>;
while (<FH>) {
}

134 名前:nobodyさん mailto:sage [2011/09/29(木) 00:44:49.60 ID:???]
>>131
ファイルがメモリにキャッシュされたから。
最後に書いたほうが早くなる。

135 名前:nobodyさん mailto:sage [2011/09/29(木) 00:45:39.00 ID:???]
訂正
最後に処理されたもののほうが早くなる。

136 名前:nobodyさん mailto:sage [2011/09/29(木) 00:54:10.24 ID:???]
最後も何も2回目以降同じじゃね
仮にキャッシュされてるんなら



137 名前:nobodyさん mailto:sage [2011/09/29(木) 01:02:01.08 ID:???]
>>135
適当に順番入れ替えてやってみ。
結果はほとんど変わらないから。

ていうかよく見たら一番最後に処理したahoが一番遅いじゃねーか。

138 名前:nobodyさん mailto:sage [2011/09/29(木) 01:09:34.61 ID:???]
やっぱり一度に全部読んだほうが2倍以上速かったな。

all => sub { open my $fh, '<', 'test.txt'; my $buf; read($fh, $buf, (-s 'test.txt')); close $fh ; return split("\n", $buf);},


139 名前:nobodyさん mailto:sage [2011/09/29(木) 01:35:54.32 ID:???]
一度に全部読んだほうが処理がしやすい場合が多い

ファイルの下に行くほど新しい書き込みの場合
最新のn件を表示する場合はwhileで1行ずつは難しいな
@linesに全部読み込んで@linesの配列の後ろからn番までを切り取って表示すれば簡単だな

140 名前:nobodyさん mailto:sage [2011/09/29(木) 01:40:46.41 ID:???]
結局のところ「用途による」だろ

141 名前:nobodyさん mailto:sage [2011/09/29(木) 01:53:22.20 ID:???]
>>139
ファイルの最後の方から読んでいって
改行の数を数えたほうが早いよ。

142 名前:nobodyさん mailto:sage [2011/09/29(木) 02:22:14.02 ID:???]
ファイルの最後の行から上の行に向かって1行ずつ取り出せるの?
ファイル読み込み位置操作できるのseekしか見つからなかったが
これ行単位じゃなく後ろからのバイト数なんだよな

143 名前:nobodyさん mailto:sage [2011/09/29(木) 02:39:16.38 ID:???]
ゆとりか。作れよ。

144 名前:nobodyさん mailto:sage [2011/09/29(木) 04:40:11.37 ID:???]
>>142
www.din.or.jp/~ohzaki/perl.htm#File_Reverse

145 名前:nobodyさん mailto:sage [2011/09/29(木) 06:43:00.87 ID:???]
>>137
一応書いとくが、Benchmarkのサブルーチン実行は記載順じゃないぞ。
勝手にソートされる。
もちろん、135の意見に同意するわけでは無いが。

ahoが遅いのは、明白に(<$fh>)の時点でメモリに確保(無名配列への代入と同等)
されてて、その後に@arrにpushしてるから、遅いの当たり前。
サブルーチンの名前が「アホ」な時点でネタだと分る。


146 名前:nobodyさん mailto:sage [2011/09/29(木) 07:40:54.50 ID:???]
AWKのAの人ディスってんの……



147 名前:nobodyさん mailto:sage [2011/09/29(木) 08:22:35.67 ID:???]
>>130
以下は自分の推測。
正しいかはわからない。

@arr = <$fh>;は、まずreadline関数内で、全行のリストが作られ、それが@arrにコピー
されるので「@arr+全行リスト」のメモリを使う。

while (<$fh>){ push @arr, $_ }は、1行だけが$_に入るので、「@arr+1行分」のメモリ
しか使っていない。

メモリ使用量の差が速度差に出たと。

148 名前:nobodyさん mailto:sage [2011/09/29(木) 11:31:16.87 ID:???]
>>130
7.8MB のテキストファイルでぶん回してみた

Benchmark: timing 10000 iterations of aho, arr, whi...
aho: 1337 wallclock secs (1157.39 usr + 103.11 sys = 1260.50 CPU) @ 7.93/s (n=10000)
arr: 1284 wallclock secs (1118.88 usr + 102.05 sys = 1220.92 CPU) @ 8.19/s (n=10000)
whi: 921 wallclock secs (768.06 usr + 104.30 sys = 872.36 CPU) @ 11.46/s (n=10000)
Rate aho arr whi
aho 7.93/s -- -3% -31%
arr 8.19/s 3% -- -29%
whi 11.5/s 44% 40% --


149 名前:nobodyさん [2011/09/29(木) 16:22:24.12 ID:zOJkGfGB]
sendmailとperlで質問です。
メールからプログラムを起動したくて色々設定を行っているのですが
どうにも行き詰ってしまいました。

CentOSにwebminを入れて管理しています。
sendmailにエイリアスを利用してプログラムを起動しようとしているのですがうまくいきません。

とりあえず外部からのメールは受信出来ている状態です。
登録用のエイリアスにプログラムに送ると合わせてユーザーにもメール配信していますが
そちらには届いている事を確認済みです。
smrshについてはリンクを設定済みでエラーは返ってこなくなりました。

この状態で簡単なプログラムを作成して動作確認を行おうとしたのですが
プログラムが動きません。

#!/usr/bin/perl --

open(OUT, ">> datafile.txt");
print(OUT "動作確認\n");
close(OUT);

試しでこのようなコードを置いてるのですが動きません。
プロンプトから動作させた場合は正しくファイルに書き込まれています。

エイリアスの指定の仕方がまずいとかでしょうか?

エイリアス名: "|/usr/bin/perl /var/www/html/プログラム名"
のような感じで指定しています。
直接
エイリアス名: "|/var/www/html/プログラム名"
としてもダメでした。
もしわかるかたがいらっしゃいましたらよろしくお願いします。

150 名前:149 [2011/09/29(木) 16:24:24.50 ID:zOJkGfGB]
追記
パーミッションは
プログラム755
書き込み用ファイル666
としています。

151 名前:nobodyさん mailto:sage [2011/09/29(木) 16:36:26.36 ID:???]
まずすべきことは、エラーログを見てみる。

152 名前:nobodyさん mailto:sage [2011/09/29(木) 16:41:31.46 ID:???]
>>149
メールがサーバに届いているなら、/var/log/maillogかなんかに出ているログを確認するというのが基本です。
気になったのは、ファイルパス。シェル上ではログイン時にそのユーザー派のホームディレクトリにカレントパスがセット
されますが、sendmailで受けた場合はそのパスにならないのだから、絶対パスで指定する必要があります。

153 名前:nobodyさん mailto:sage [2011/09/29(木) 16:41:44.87 ID:???]
> open(OUT, ">> datafile.txt");
この datafile.txt はどのディレクトリに書き込まれるの?
パーミッションエラーで書き出せないとかじゃないの?

154 名前:149 mailto:sage [2011/09/29(木) 16:59:53.15 ID:???]
>>152,153
盲点でした絶対パスで書いたら問題無く書き込めてました。
ありがとうございました!

155 名前:nobodyさん mailto:sage [2011/09/29(木) 17:44:48.07 ID:???]
結局Perlは関係なかったね。

156 名前:nobodyさん mailto:sage [2011/09/29(木) 17:51:14.58 ID:???]
せやろか?



157 名前:nobodyさん mailto:sage [2011/09/29(木) 21:10:32.23 ID:???]
せのつくあれをやるなんていやらしい

158 名前:nobodyさん mailto:sage [2011/09/29(木) 21:45:52.72 ID:???]
最近じゃ、小学生どうしでもするんですってね、






せいくらべ。

159 名前:nobodyさん mailto:sage [2011/09/30(金) 03:01:50.06 ID:???]
投稿の表示の上にページ数を載せたい場合
最大ページ数=投稿数/1ページあたりの表示数の少数切り上げだから
投稿数がわからないと最大ページ数がわからないわけだから
whileだと最初にwile(<IN>){$toukousuu++;}で投稿数出してそのあとwile(<IN>){表示}の
2回ループしなきゃならないけど@lines一括読み込みなら$toukousuu=@linesのforeach(@lines){表示}の1回ループですむ

160 名前:nobodyさん mailto:sage [2011/09/30(金) 03:40:56.53 ID:???]

   ∩___∩         |
   | ノ\     ヽ        |
  /  ●゛  ● |        |
  | ∪  ( _●_) ミ       j
 彡、   |∪|   |       >>159
/     ∩ノ ⊃  ヽ
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ /


161 名前:nobodyさん mailto:sage [2011/09/30(金) 09:23:13.25 ID:???]
hibari.2ch.net/test/read.cgi/affiliate/1317192380/
akiyan降臨中w

162 名前:nobodyさん mailto:sage [2011/09/30(金) 12:34:30.65 ID:???]
>>160
何で釣り扱いされているのかわからんw
じゃあ例えばファイルの下から10番目までの行であるならばフラグを立てるという場合
while(<IN>){

$aaa = $toukousuu-10;

if($count>=$aaa){
$flg = 1;
}
else{
$flg = 0;
}
$count++;
}
としなければならないが$toukousuuを求めるのはこれよりまえにwhile(<IN>){$toukousuu++;}とする必要が
あるのはわかるだろ。
つまりwhileだとループを2回しなければならんのだよ

163 名前:nobodyさん mailto:sage [2011/09/30(金) 13:19:30.58 ID:???]
             |
〜〜〜〜〜〜〜〜|〜〜〜〜〜〜〜〜〜〜
   >( c´_ゝ`)  |
            |
>( c´_ゝ`)     J
     >( c´_ゝ`)



             |
〜〜〜〜〜〜〜〜|〜〜〜〜〜〜〜〜〜〜
             |     >( c´,_ゝ`)
             |
             J   >( c´,_ゝ`)
                    >( c´,_ゝ`)

164 名前:nobodyさん mailto:sage [2011/09/30(金) 18:04:53.60 ID:???]
>>162
うん。そうだね。それで?それがどうかしたの?

って感じ。

165 名前:nobodyさん mailto:sage [2011/09/30(金) 18:27:33.76 ID:???]
>>164
だって2回ループするとその分重くなるじゃん

166 名前:nobodyさん mailto:sage [2011/09/30(金) 18:55:57.64 ID:???]
>>165
どのみち全数読み込まなきゃいけないんだったらもちろん一括読み込みすればいいんだけどさ。
しかし重くなるのが嫌だったら投稿数などのインデックス情報の類は別途保存して、
独立して管理するという方法もあるぞ。
そうすれば $count = @array; みたいにいちいち配列の要素数を数えなくても済む。



167 名前:nobodyさん mailto:sage [2011/09/30(金) 19:33:37.65 ID:???]
>>165
slurp の方が早いよって主張ならまだしも、、、
>>130の結果が理解出来てないだろお前さん。
% perl -le '$s = q{x} x 1000000 ; $s =~ s/(.{1,50})/$1\n/g; print $s ' > test.txt
% cat hoge.pl
use Benchmark qw( timethese cmpthese ) ;
cmpthese timethese ( undef, {
arr => sub { open my $fh, q{<}, q{test.txt} ; my @arr = <$fh> ; close $fh ; printf STDERR "%d\n", scalar @arr ; for ( @arr ){ print STDERR; } },
whi => sub { open my $fh, q{<}, q{test.txt} ; my @arr ; while (<$fh>){ push @arr, $_ } ; close $fh ; printf STDERR "%d\n", $. ; for ( @arr ){ print STDERR; } },
});
% perl hoge.pl 2> /dev/null
Benchmark: running arr, whi for at least 3 CPU seconds...
arr: 4 wallclock secs ( 2.00 usr + 1.23 sys = 3.23 CPU) @ 242.11/s (n=782)
whi: 4 wallclock secs ( 1.95 usr + 1.29 sys = 3.24 CPU) @ 254.94/s (n=826)
Rate arr whi
arr 242/s -- -5%
whi 255/s 5% --


168 名前:nobodyさん mailto:sage [2011/09/30(金) 20:14:25.09 ID:???]
>>166
全部読み込むにしても一括読み込みだとメモリ食うよ
一行ずつ回す方がいい

>>167
読んだけど意味が分からない

169 名前:nobodyさん mailto:sage [2011/09/30(金) 20:49:46.04 ID:???]
165の「重い」ってメモリの重さの話か?
速度の話だと誤読したわ。

速度だと既に結論が出てて、>>130理解してれば、
while(<$fh>){ push @arr, $_ ; } が、@arr=<$fh>;
より早いんだから、後の処理が同じなら何回ループ回そうが、
無関係。カウンタを自分で付けようが、 $. 利用しようが同じ。

メモリ?
んなもん、同じファイルなら、
@arr =<$fh> ;だろうが、一行づつ回そうが誤差範囲だろ。
それを何回回そうが無関係。
@arr = do{ local $/ ; $buf = <$fh> ; split /^/ms, $buf ;
なんかするんだったら多くかかるのは当然だけど。

sub myps { print `ps ux $$`};
myps;
# お好きなコード
myps;
でもして差分取れば?

170 名前:nobodyさん mailto:sage [2011/09/30(金) 20:50:40.41 ID:???]
×@arr = do{ local $/ ; $buf = <$fh> ; split /^/ms, $buf ;
◯@arr = do{ local $/ ; $buf = <$fh> ; split /^/ms, $buf ; } ;


171 名前:nobodyさん mailto:sage [2011/09/30(金) 21:29:34.48 ID:???]
釣りにマジレス
>>159
open my $fh, '<', 'hoge.pl' ;
while ( <$fh> ){ }
print "$.\n" ;
while ( <$fh> ){ print }
close $fh ;
このコードを hoge.pl として保存して実行してみろ。

と言うことで、
>>167
165 の言う「2回ループ」は上のコード、好意的に判断しても
「ファイルハンドル開き直してのファイル読み込み2回」って意味だ。
あなたの突っ込みは通じない。

172 名前:nobodyさん mailto:sage [2011/09/30(金) 23:04:33.02 ID:???]
あれ?まだやってるの?

ほんとうの意味でファイルを一括で読むこっちが
一番速いって答えは出たと思うんだけど。
all => sub { open my $fh, '<', 'test.txt'; my $buf; read($fh, $buf, (-s 'test.txt')); close $fh ; return split("\n", $buf);},



173 名前:nobodyさん mailto:sage [2011/09/30(金) 23:07:07.88 ID:???]
foreach ( split/\n/, $buf ) {}
はい

174 名前:nobodyさん mailto:sage [2011/09/30(金) 23:11:26.42 ID:???]
もうその話しじゃなくなってんだが、まあ突っ込んでやる。
同等の条件にすると話しにならんくらいarrの方が早い。
cmpthese timethese ( undef, {
arr => sub { open my $fh, q{<}, q{test.txt} ; <$fh> },
all => sub { open my $fh, '<', 'test.txt'; my $buf; read($fh, $buf, (-s 'test.txt')) ; split(/^/ms, $buf);},
});
結果↓
Benchmark: running all, arr for at least 3 CPU seconds...
all: 3 wallclock secs ( 2.72 usr + 0.36 sys = 3.08 CPU) @ 1366.56/s (n=4209)
arr: 4 wallclock secs ( 1.51 usr + 1.66 sys = 3.17 CPU) @ 30816.72/s (n=97689)
Rate all arr
all 1367/s -- -96%
arr 30817/s 2155% --



175 名前:nobodyさん mailto:sage [2011/09/30(金) 23:13:06.26 ID:???]
174はまちがい
スカラーコンテキストで評価されるわw


176 名前:nobodyさん mailto:sage [2011/09/30(金) 23:21:35.32 ID:???]
まちがい。arrは遅かったw



177 名前:nobodyさん mailto:sage [2011/09/30(金) 23:22:41.29 ID:???]
@arr =<$fh>がファイル一括読み込みよりも
遅いのは当たり前の話で、内部的に一行づつ読み込んでいるから。

178 名前:nobodyさん mailto:sage [2011/09/30(金) 23:23:54.55 ID:???]
同等の条件
arr => sub { my @arr = sub{ open my $fh, q{<}, q{test.txt} ; <$fh> }->() },
all => sub { my @arr = sub{ open my $fh, '<', 'test.txt'; my $buf; read($fh, $buf, (-s 'test.txt')) ; split(/^/ms, $buf); }->() },
まあ、 all の方が早いわな。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<211KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef