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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
0109nobodyさん2006/06/02(金) 20:24:21ID:???
ふつつかものだけど幸せにしてね('A`*)
0110nobodyさん2006/06/02(金) 20:25:29ID:???
男同士だったらどうすんだよ
0111nobodyさん2006/06/02(金) 20:35:06ID:???
問題なく結合します。
use Tie::Man::And::Man;
my $happy = tie $res106, Tie::Man::And::Man, $res107;
0112nobodyさん2006/06/02(金) 20:37:13ID:???
my $happy = tie $res106, Tie::Man::And::Man, $res107; # この状態ではシンボリック
$happy->insert(); # ここで実体化(ハード)
挿入する段階でハードリファレンスってどうやるの?
0113nobodyさん2006/06/02(金) 20:43:35ID:???
>>105 が聞きたかったのはこういう事かな? と ESP を発揮!

$test = \1; # リテラルスカラー値に対するハードリファレンス
print $$test; # デリファレンス

多分シンボリック=リテラルだと思ってるのかな と想像。

シンボリック=実体はただの文字列。文字列をデリファレンスするとシンボルテーブルから
         その名前を持つモノをひっぱってきてくれる。
0114nobodyさんNGNG
エスパーすげー
0115nobodyさん2006/06/02(金) 21:01:00ID:???
エスパースレいる?
0116nobodyさん2006/06/02(金) 21:46:32ID:???
リテラルとかハードリファレンスとかシンボリックとかわかんね〜!!!詳しく解説してるとこキボン
0117nobodyさん2006/06/02(金) 22:15:15ID:???
>>116
俺もよくわかんなくて、ガンガッってググったよ。
ここ↓とかどう? perl-解説ってとこ。

山口家の逆襲
http://kabocha.org/jelfe/

0118nobodyさん2006/06/02(金) 22:23:29ID:???
もうやめたw
0119nobodyさん2006/06/02(金) 22:38:40ID:???
wwwww
0120nobodyさん2006/06/02(金) 22:45:09ID:???
Perl歴1ヶ月とちょっとなんですけど、こんな理解であってますか?

●リテラル
コードに直接埋め込まれている値
・123 3.14 のような数値
・"abc" 'hoge' のような文字列
・(1, 2, 3) (hoge=>123, huge=>456) のようなリスト  など

●ハードリファレンス(ただ単にリファレンスと言った場合はこれ)
値に対する参照。これ自体もスカラー値。C言語やってた人はポインタと考えれば良い。
ハードリファレンスを生成するには、以下の方法がある。
・値や変数の前に「\」を付ける → その値に対してのリファレンス
・[1, 2, 3] → 無名の配列が自動的に作られて、その無名配列に対するリファレンス
・{hoge=>123, huge=>456} → 無名のハッシュに対するリファレンス
・sub { CODE } → 無名の関数に対するリファレンス(クロージャ)

●シンボリックリファレンス
ただの文字列。文字列をデリファレンスすると、パッケージが持つシンボルテーブル
(パッケージ変数の名前と実体を結び付ける表)を通じて、その文字列の名前を持つ
実体を得る事ができる。誤爆しやすいので use strict; すると使えない。
0121nobodyさん2006/06/03(土) 00:18:22ID:???
1ヶ月ならその理解で十分だよ。
0122nobodyさん2006/06/03(土) 02:04:02ID:???
俺は4年やってるがリファレンスなんてサッパリのクソ野郎だぜ
0123nobodyさん2006/06/03(土) 02:21:53ID:???
>>122
are u mr.kent?
0124nobodyさん2006/06/03(土) 18:24:46ID:???
ちょっと質問。

$" = '/';
@list = (10, 20, 30, 40, 50);
$scalar = "@list";
これで
$scalar = join( "/" , @list);
と同じ結果になるようだけど、「$" = '/';」を使った場合には、
特殊変数$"のデフォルトの値を変えてしまうから
その後もずっとjoinせずとも/で区切られた値になるという感じなのかな。

他にはサブルーチンの@_とかは元の値が変わっちゃうみたいだけど、
特殊変数の扱いはブロックの中だけ?それともブロックの中とか関係なし?
どちらの場合もある?

その辺は一時的なものなのか、恒久的(ちょっと変な表現だけどw)なのか教えて下され。
0125nobodyさん2006/06/03(土) 18:54:27ID:???
上はあってる。
ただし、mod_perl とか $" とかだとうまくできない場合があるね。

「特殊変数」 が 「$"」 とかを指すなら、
それの有効範囲はグローバル変数と一緒。
local $" とかもできるよ。
0126nobodyさん2006/06/03(土) 18:56:58ID:???
perl -e '@a=qw/a b c/; {local $"=q!/!; print "@a\n";} print "@a\n";'
perl -e '@a=qw/a b c/; {$"=q!/!; print "@a\n";} print "@a\n";'
0127nobodyさん2006/06/03(土) 20:34:18ID:???
個人的には「join」使っておけって思う
0128nobodyさんNGNG
$"は遅いよ
01291242006/06/03(土) 22:08:37ID:???
サンクス。
なんとなくイメージがつかめたよ。
0130nobodyさん2006/06/03(土) 23:16:29ID:???
localを使わなければ永久に変わる。
my にはグローバル変数およびパッケージ変数を宣言する能力がないので
ここにlocalとmyの大きな差がある。
呼び出し先のサブルーチンでの参照可能性でlocalとmyの差を説明するやつはウンコ
0131nobodyさん2006/06/04(日) 00:07:15ID:???
my→レキシカル変数の宣言
our→パッケージ変数の宣言
local→パッケージ変数のダイナミックスコープ化
という理解でおk?
0132nobodyさん2006/06/04(日) 00:46:14ID:???
our は C で言う static ?
0133nobodyさん2006/06/04(日) 01:08:44ID:???
ちゃうちゃう。
0134nobodyさん2006/06/04(日) 01:18:27ID:???
ちゃうのか・・・それなら覚えやすいな。 とか思ったのに (´ω`)
0135nobodyさん2006/06/04(日) 09:23:10ID:???
Javaのstaticに近くない?
0136nobodyさん2006/06/04(日) 10:40:42ID:???
CGI::Prettyを使って、ちょっと大きめのテーブルを表示し
ようとしたんです。
32文字ぐらい *16列 * 4098行 = 2M 程度。
メモリは2ギガ積んでいます。
しかし、実行するとメモリの使用率がガンガン上がって
いって止まってしまうんです。
use CGI::Pretty をコメントアウトすると問題ありません。
テーブルのサイズが小さいときは問題ありません。
なぜでしょう?
CGI::Pretty は使わないほうが速いというのはわかるんです
が、使わないと、HTMLソースがすごく見にくいので、できれ
ば使いたいんです。
CGI::Pretty って\tと\nを入れているだけにしか見えないの
ですが、そんなにメモリを使用するものなのでしょうか?
Windows,Linuxどちらでも、以下のスクリプトでも再現しました。
use strict;
use CGI qw(:standard);
use CGI::Pretty;
my @trs;
my @tds=qw(0 1 2 3 4 5 6 7 8 9 a b c d e f);
push @trs,td({bgcolor=>'#FFFFFF'}, \@tds) for (0..4097);
print header,start_html;
print table(Tr \@trs);

どこが問題なのでしょう?

ブラクラのつもりは無いのですが、
http://pc8.2ch.net/test/read.cgi/tech/1149259409/69
のようにswapし始めて、サーバが応答しなくなることがあるみたい
ですので、試すときは注意してください。
0137nobodyさん2006/06/04(日) 11:49:27ID:???
テーブルなら、

HTML::Table
ttp://homepage3.nifty.com/hippo2000/perltips/html/table.htm

があるけど、こちらを使ってみてはいかがでしょうか?
0138nobodyさん2006/06/04(日) 12:18:09ID:???
for (0..255);
で試した。
別 PC のブラウザで開いて、サーバーのメモリを監視してたら、ピークで 400MB 突破して、
250-350MB で変動してました。
で、500 Error で止まったw

Windows2000 + Perl 5.8.4 で試した。

自力で表示した方がいいんじゃないの?
0139nobodyさん2006/06/04(日) 12:24:48ID:???
for (0..128);
だと 143MB ピークで正常終了
0140nobodyさん2006/06/04(日) 12:46:25ID:???
たった256行表示するのに200メガ以上使ってエラー?
やっぱりモジュール使って書くメリットってのがわからない。
モジュール使ったほうがいいって言ってるヤツの意見を聞いてみたいね。
0141nobodyさん2006/06/04(日) 12:59:04ID:???
>>136
この程度のテキスト処理にそんなにメモリを使うはずがない。
と思って試したら本当にものすごい負荷がかかる。何なんだコレ?
0142nobodyさん2006/06/04(日) 13:13:35ID:???
ぃゃぃゃぃゃ、1つの悪で全てが悪と決め付けるのはいくないかと
0143nobodyさん2006/06/04(日) 14:07:00ID:???
>>136
@CGI::Pretty::AS_IS = grep !/^td$/, @CGI::Pretty::AS_IS;

これを use CGI::Pretty; の後に差し挟むことで耐用限界を引き上げることができるはず。
アドホックでバッドプラクティス全開なので、あくまで応急処置。

こういうの思いついちゃう自分が嫌い。
0144nobodyさん2006/06/04(日) 15:43:10ID:???
Win32::OLEを使って以下のようにExcelのセルのデータを取り出しています。
その場合、元の値が「2004/7/7」という中央寄せの文字列(日付型ではない)のとき、取り出した値が
Win32::OLE::Variant=SCALAR(0x1c14028)
となってしまうのですが、何が原因なのでしょうか。

use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Excel';

my $master_excel_file = "xlsファイル";

$Win32::OLE::Warn = 3;
my $Excel = Win32::OLE->GetActiveObject('Excel.Application')
|| Win32::OLE->new('Excel.Application', 'Quit') || die;
my $Book = $Excel->Workbooks->Open($master_excel_file) or die;

foreach my $row(@{$Book->Worksheets(1)->Range(A1:Z1000)->{'Value'}}) {
my @values = @$row;
}
0145nobodyさん2006/06/04(日) 17:00:56ID:???
CGI::Pretty って標準モジュールなのなw
256程度でエラーとか、全然かわいくねーよw
0146nobodyさん2006/06/04(日) 17:05:04ID:???
CGI::Prettyの_prettyPrintがあまり実行効率を考えていないようなので
書き直してみた。いちおうmake testは通る。

sub _prettyPrint {
my($input) = @_;

return if !$CGI::Pretty::LINEBREAK || !$CGI::Pretty::INDENT;

$$input =~
s/\Q$CGI::Pretty::LINEBREAK\E/$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT/gi;

my $as_is = join '|', map { quotemeta $_ } @CGI::Pretty::AS_IS;
$$input =~ s:(<($as_is)[\s>].*?</\2>):_deIndent($1):egi;
}

sub _deIndent {
my($s) = @_;

$s =~ s/\Q$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT\E/$CGI::Pretty::LINEBREAK/gi;

return $s;
}
0147nobodyさん2006/06/04(日) 17:21:35ID:???
爆速になった
せっかくだからオリジナルを保存して書き換えてしまうか
0148nobodyさん2006/06/04(日) 17:24:55ID:???
>>146
え、それで同じ結果になるの? すごくね?
後学のために _prettyPrint の問題点を教えてください。
0149nobodyさん2006/06/04(日) 17:50:35ID:???
>>146
これすげぇ
0150nobodyさん2006/06/04(日) 18:20:33ID:???
オリジナルの_prettyPrintは再帰しまくってるからメモリと速度が駄目駄目なのかな?
とか思いつつお買い物・・・
0151nobodyさん2006/06/04(日) 18:23:50ID:???
>>145
専門用語として伝統的にPretty Printって言ったら整形出力の意味な。
つまり、かわいいHTMLソースを作る職人が大喰ら(ry

>>146
それ処理的に等価じゃないな…
例えばpreの中身がインデントされちゃうから実用的にも影響が出る。
div( pre( "hoge\nfuga" ) )
しかしそれにしても元のやつには改善の余地があるような…漏れもリファクタリングやってみよう
0152nobodyさん2006/06/04(日) 18:49:36ID:???
>>151
すまん、バグっていた。s修飾しないと「.」が改行にマッチしないから
@AS_ISで指定されるタグに囲まれる部分が複数行にまたがるときに
おかしくなるね。

$$input =~ s:(<($as_is)[\s>].*?</\2>):_deIndent($1):egi;



$$input =~ s:(<($as_is)[\s>].*?</\2>):_deIndent($1):egis;

これでその例も同じ結果になるはず。
0153nobodyさん2006/06/04(日) 19:02:53ID:???
>>148,150
@AS_ISで指定したタグに囲まれた部分はインデントを追加しないで
他の部分に追加ということをやりたいようなのだが、オリジナルは
以下のような処理になっている。

if (@AS_ISタグに囲まれた部分がある) {
文字列を 「囲まれた部分の前」、「囲まれた部分」「囲まれた部分の後」
 の3つに分割

「囲まれた部分の前」「囲まれた部分の後」をそれぞれ再帰的に
自分を呼んでインデント

「囲まれた部分の前」をインデントしたもの,「囲まれた部分」,
「囲まれた部分の後」をインデントしたものを連結して返す
} else {
改行の後ろにインデントを追加する
}

デフォルトで@AS_ISにtdが含まれているので、<td>〜</td>の数だけ
再帰する。再帰するごとにだんだん短くなるが文字列がコピーされるので
O(n^2)のメモリを消費し、コピー処理でCPUも同じオーダで食うようだ。

書き直した奴は、

とりあえず全部の改行にインデントをつける
@AS_ISで指定されたタグに囲まれた部分の改行の後のインデントを削って戻す

という処理にしてみた。
0154nobodyさん2006/06/04(日) 19:43:37ID:tvwlqg+d
すいません、質問です

ActivePerlの導入をしようと思い、msi版をダウンロードしても、
”有効なwin32アプリケーションではありません ”
になります。
当方、Win98なんですがどうすれば導入できますか?
0155nobodyさん2006/06/04(日) 20:20:57ID:???
>>154
ActivePerlをダウンロードしたページの
Installation Notes
の部分をよく読めば導入できます
0156nobodyさんNGNG
勉強になるなぁ
0157nobodyさん2006/06/04(日) 21:24:40ID:???
>>153
わかりやすい解説ありがとう!
なるほどなるほどって感じ。
発想変えるだけでコードがガラっとかわる手本だね。
0158nobodyさん2006/06/04(日) 22:05:46ID:???
CGI::Pretty たんのドジッ娘属性に萌えた。
01591542006/06/04(日) 22:29:14ID:???
>>155
Windows Installer 2.0+ is required for Windows.
download for 9x/Me

ってことですね。ありがとうございました。
0160nobodyさん2006/06/05(月) 04:51:59ID:???
ねえねえ。
ベンチとったら、(10000回)

my $string2 = lc $string;

が 5.7 秒で

my $string2 = $string;
$string2 =~ tr/A-Z/a-z/;

が 2.6 秒だったんだけど、これどういうこと?
同じことしてるんじゃないんだっけ?
0161nobodyさん2006/06/05(月) 06:47:28ID:???
>>160
うちではどっちもどっちだったよ
$ perl -v

This is perl, v5.8.7 built for cygwin-thread-multi-64int

$ cat hoge.pl
use Benchmark;
my $string = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
timethese(10000*100,
{
'lc' => sub {my $string2 = lc $string;},
'tr' => sub {my $string2 = $string;$string2 =~ tr/A-Z/a-z/;},
});

$ perl hoge.pl
Benchmark: timing 1000000 iterations of lc, tr...
lc: 2 wallclock secs ( 0.58 usr + 0.00 sys = 0.58 CPU) @ 1721170.40/s (n=1000000)
tr: 2 wallclock secs ( 0.54 usr + 0.01 sys = 0.55 CPU) @ 1814882.03/s (n=1000000)

$ perl hoge.pl
Benchmark: timing 1000000 iterations of lc, tr...
lc: 2 wallclock secs ( 0.52 usr + 0.00 sys = 0.52 CPU) @ 1923076.92/s (n=1000000)
tr: 2 wallclock secs ( 0.58 usr + 0.00 sys = 0.58 CPU) @ 1721170.40/s (n=1000000)
0162nobodyさん2006/06/05(月) 07:48:02ID:???
>>161
あれ、ほんとだね。わざわざありがとう。
置換するソースによって違うんかなあ?

うちは google に perl って入れてでてきた 56kb くらいのソースでやったんだけど。
それともアルファベット以外がたくさん入ってると lc は遅くなるとか? うーん・・・
perl の ver だったらやだなw

ちなみに
uc $string : 6.58 [s]
tr/a-z/A-Z/ : 5.50 [s]
0163nobodyさん2006/06/05(月) 11:03:38ID:GKAwUgKi
@xの配列が変動する状態で、
10個目以降全てに対して処理をしたい場合、
foreachで、1〜9回目のループをifで飛ばすようなやり方以外で、
何かスマートな方法はありますか?
0164nobodyさん2006/06/05(月) 11:07:12ID:???
for
0165nobodyさん2006/06/05(月) 11:23:55ID:???
>>163
配列スライスに対してforeachでいいんでね?

foreach my $i (@x[9..$#x]) { ... }
0166nobodyさん2006/06/05(月) 12:24:24ID:???
>>162
> うちは google に perl って入れてでてきた 56kb くらいのソースでやったんだけど。
それでやってみた。何回やってもlcの方が速かった。

$ cat hoge.pl
use Benchmark;
use LWP::Simple;
my $string = get('http://www.google.com/search?q=perl');
timethese(10000*100,
{
'lc' => sub {my $string2 = lc $string;},
'tr' => sub {my $string2 = $string;$string2 =~ tr/A-Z/a-z/;},
});

$ perl hoge.pl
Benchmark: timing 1000000 iterations of lc, tr...
lc: 1 wallclock secs ( 0.28 usr + 0.00 sys = 0.28 CPU) @ 3571428.57/s (n=1000000)
(warning: too few iterations for a reliable count)
tr: 0 wallclock secs ( 0.34 usr + 0.00 sys = 0.34 CPU) @ 2932551.32/s (n=1000000)
(warning: too few iterations for a reliable count)

$ perl hoge.pl
Benchmark: timing 1000000 iterations of lc, tr...
lc: 0 wallclock secs ( 0.23 usr + 0.00 sys = 0.23 CPU) @ 4347826.09/s (n=1000000)
(warning: too few iterations for a reliable count)
tr: 1 wallclock secs ( 0.32 usr + 0.00 sys = 0.32 CPU) @ 3115264.80/s (n=1000000)
(warning: too few iterations for a reliable count)
0167nobodyさん2006/06/05(月) 12:35:00ID:???
> 何回やってもlcの方が速かった。
訂正。今やったら逆転した。(warningに気づいてなかったので回数を更に10倍にした)
やっぱりどっちもどっちじゃね?2倍も差が開くとは思えないけど。。ベンチ取ったスクリプトさらしてみて。

$ perl hoge.pl
Benchmark: timing 10000000 iterations of lc, tr...
lc: 4 wallclock secs ( 3.58 usr + 0.00 sys = 3.58 CPU) @ 2797202.80/s (n=10000000)
tr: 3 wallclock secs ( 3.42 usr + 0.02 sys = 3.44 CPU) @ 2911208.15/s (n=10000000)

$ perl hoge.pl
Benchmark: timing 10000000 iterations of lc, tr...
lc: 3 wallclock secs ( 3.41 usr + 0.01 sys = 3.42 CPU) @ 2928257.69/s (n=10000000)
tr: 3 wallclock secs ( 3.45 usr + 0.00 sys = 3.45 CPU) @ 2894356.01/s (n=10000000)

0168nobodyさんNGNG
もう誤差の範囲だろ…
0169nobodyさん2006/06/05(月) 18:57:41ID:???
>>167
ってか、うち1万回で5秒とかなのに、1000万回で3秒とか、どんなPCの性能差だよw
AthronXP1700 の 512MB あるんだけどなあw perl は 5.6

・・・っと思ったら、

use strict;
use Benchmark;
use LWP::Simple;
my $string = get('http://www.google.com/search?q=perl');
print $string;

これ何もでなくね?w status_line とったら 403 返ってきたよw google 内部で弾いてんのかな・・・
こっちはブラウザから見てソース保存して開いてやってた。 〜?q=perl&num=50&hl=ja
こんな感じ。

use strict;
use Benchmark;
my $string;
open (LOAD, 'lc.html'); read (LOAD, $string, -s LOAD); close (LOAD);
timethese(10000, {
'lc' => sub {my $string2 = lc $string;},
'tr' => sub {my $string2 = $string;$string2 =~ tr/A-Z/a-z/;},
});
0170nobodyさん2006/06/05(月) 19:14:18ID:0Db/Ehfs
文字列を一文字ずつ処理して
とある文字が出てきたところで区切って
その区切ったそれぞれの文字を配列に入れるということをしたいのですけど、l
やり方が浮かばなくて・・・
どのようにコーディングすればいいのでしょうか?
0171nobodyさんNGNG
日本語でもう一度
0172nobodyさん2006/06/05(月) 19:28:24ID:???
>>170
split
0173nobodyさん2006/06/05(月) 19:39:21ID:0Db/Ehfs
>>172
あっ 出来ました。 ありがとうございます
0174nobodyさん2006/06/05(月) 19:52:22ID:JTs163rf
CPANのインストールディレクトリってどこにしてる?
デフォの /home/~username/.cpan にしとく?自分用に変える?
dotディレクトリに入れるのがなんか気持ち悪いんだが、、、
0175nobodyさん2006/06/05(月) 21:46:17ID:???
>>174
> dotディレクトリに入れるのがなんか気持ち悪いんだが、、、

そんなことないよ。気持ちいいよ。
0176nobodyさん2006/06/06(火) 01:40:03ID:???
テキストファイルから読み込んだ@listに対して
それぞれ一行ずつを取り出して表示させるにはどうすればよいでしょうか?
0177nobodyさん2006/06/06(火) 01:53:24ID:???
foreach
ていうか、本くらい読め。基本過ぎる
0178nobodyさん2006/06/06(火) 02:06:41ID:???
>>177
本だと私のやりたいことが載ってなかったので質問してしまいました
すいません、、、

@listに代入させた各行の1番目の<p></p>はそのまま、2番目の<p></p>を削除したいのですが、、、
0179nobodyさん2006/06/06(火) 02:11:03ID:???
>>178
その foreach の載ってない本の題名を教えてください。
0180nobodyさん2006/06/06(火) 02:18:35ID:???
以前、正規表現道場というスレがあったと思うのですが、
なくなっちゃったんですか?探してもないんだけど。
0181nobodyさん2006/06/06(火) 02:18:54ID:???
>>178
その s の載っていない本の題名を教えてください。
0182nobodyさん2006/06/06(火) 02:25:49ID:???
>>179>>181
「Perl&CGI入門」という本です

1番目の<p></p>はそのまま、2番目の<p></p>を削除がちょっと、、、

0183nobodyさん2006/06/06(火) 03:09:49ID:???
本当に本を読んでいるとしたら、もしかして応用力のない子ですか?
正規表現くわしくのってないのかな? 持ってないから分からん・・。

$line =~ s{^(.*?<p>.*?</p>.*?)<p>.*?</p>}{$1};
↓ (<p class="〜"> とかもあるなら)
$line =~ s{^(.*?<p(?:\s[^>]*)?>.*?</p>.*?)<p(?:\s[^>]*)?>.*?</p>}{$1};

これでいいかな? 試してないけど。
後で 3番目以降も削除したいんですけど、とか聞かないでね。応用しる。

あまりに正規表現に弱かったら、

if ($line =~ /<p>/) {
$line =~ s{<p>}{\x01};
$line =~ s{</p>}{\x02};
$line =~ s{<p>.*?</p>}{}g;
$line =~ s{\x01}{<p>};
$line =~ s{\x02}{</p>};
}
とでもやればいいんじゃねw おすすめはしないけど。
でもなんで 1番目だけいらないんだろうなw どう使うのか予想つかないわ。
0184nobodyさん2006/06/06(火) 03:13:16ID:???
>>180
たぶん、ム板にあるからいいじゃんということになったんだと思う
正規表現 part2
http://pc8.2ch.net/test/read.cgi/tech/1131028296/
0185nobodyさん2006/06/06(火) 03:16:48ID:???
>>169
> これ何もでなくね?w status_line とったら 403 返ってきたよw google 内部で弾いてんのかな・・・
うはwwwごめんwww

同じスクリプトでやってみた。trの方が速いっぽい。まあそれでも2倍も差はつかないけども。。

$ perl -v | head -2

This is perl, v5.8.7 built for cygwin-thread-multi-64int

$ wc lc.html
133 2052 60082 lc.html

$ for i in 1 2 3 4 5 ; do perl hoge.pl ; done
Benchmark: timing 10000 iterations of lc, tr...
lc: 3 wallclock secs ( 2.93 usr + 0.00 sys = 2.93 CPU) @ 3408.32/s (n=10000)
tr: 3 wallclock secs ( 2.47 usr + 0.00 sys = 2.47 CPU) @ 4043.67/s (n=10000)
Benchmark: timing 10000 iterations of lc, tr...
lc: 3 wallclock secs ( 2.97 usr + 0.00 sys = 2.97 CPU) @ 3362.47/s (n=10000)
tr: 3 wallclock secs ( 2.47 usr + 0.00 sys = 2.47 CPU) @ 4042.04/s (n=10000)
Benchmark: timing 10000 iterations of lc, tr...
lc: 3 wallclock secs ( 2.90 usr + 0.00 sys = 2.90 CPU) @ 3443.53/s (n=10000)
tr: 3 wallclock secs ( 2.56 usr + 0.00 sys = 2.56 CPU) @ 3901.68/s (n=10000)
Benchmark: timing 10000 iterations of lc, tr...
lc: 3 wallclock secs ( 2.92 usr + 0.00 sys = 2.92 CPU) @ 3419.97/s (n=10000)
tr: 3 wallclock secs ( 2.49 usr + 0.00 sys = 2.49 CPU) @ 4011.23/s (n=10000)
Benchmark: timing 10000 iterations of lc, tr...
lc: 3 wallclock secs ( 2.90 usr + 0.00 sys = 2.90 CPU) @ 3443.53/s (n=10000)
tr: 3 wallclock secs ( 2.47 usr + 0.01 sys = 2.48 CPU) @ 4027.39/s (n=10000)
0186nobodyさん2006/06/06(火) 06:19:56ID:???
trで代わりの動作が出来る場合はtrの方が早いというのは周知の事実かと思ってたが・・・
0187nobodyさん2006/06/06(火) 10:15:26ID:???
手持ちのカードで何ができるかを考えるのは自分ですよ
自分はこうやってるんだけど他にいい方法ない?ならわかるけどさ。
0188nobodyさん2006/06/06(火) 11:17:16ID:???
どこのはなし?
0189nobodyさん2006/06/06(火) 11:22:27ID:???
>>178あたり。
0190nobodyさん2006/06/06(火) 14:59:19ID:Re1RmuFG
簡易予定表のようなものを組んでみたんですが、なんだかモッサリしてる気がします。
もっと簡潔に書けるような気がするんですが自分ではこれが限界でした。
あと、ファイルロックのやり方が合っているのか自信がありません。
一応動いていることは動いているんですが、問題はないでしょうか。
改良すべき点、根本的にこういう書き方に直した方が良い、とかあればアドバイスお願いします。
大まかな内容は以下のようなものです。

予定として保存する内容は「予定日(月と日)」と
「予定内容(長くても200バイト程度)」の2つでフォームから渡します。
予定を保存するファイルは月単位で作成します。
例えば2006年5月の予定の場合なら「200605.txt」というファイル名です。
保存するファイルがないときはその都度作成し、

6月1日

6月2日

6月3日
.
.
.
という風に日付だけを先に入れておきます。
保存するファイルがあるときは、
フォームから渡された「予定日」とマッチした日付の次の行に「予定内容」を書き込みます。

内容は以上です。次レスにコードを晒します。
0191190(前半)2006/06/06(火) 15:03:27ID:???
# 保存するファイル名
$a = sprintf("%04d%02d",$YEAR,$MON)
$file = "$a.txt";

# 月から日数を出す
if($MON == 1|3|5|7|8|10|12){
$m = 31;
}elsif($MON == 4|6|9|11){
$m = 30;
}else{
if($YEAR % 4 ==0){
$m = 29;
}else{
$m = 28;
}
}

for($i=1;$i<=$m;$i++){
$date .= "$MON月$i日\r\n\r\n";
}
0192190(後半)2006/06/06(火) 15:04:16ID:???
# 該当する月のファイルがなければ作成
if(!open(IN,"$file")){
open(OUT,">$file")
flock(OUT,2);
print OUT $date;
close(OUT);
}
open(IN,"$file");
flock(IN,2);
@A = <IN>;
close(IN);

# 「予定日」とファイル内の「日付」をマッチングさせて該当日付に「予定内容」を書き込む
$loop = @A;
$i = 0;

while($loop > 0){
if($A[$i] eq $plan_day){# $plan_day = "フォームからの情報(予定日)";
$A[$i] .= "$plan_value\r\n";# $plan_value = "フォームからの情報(予定内容)";
}
$loop --;
$i ++;
}

if(!open(OUT, "+< $file")){&error;};
flock(OUT, 2);
truncate(OUT, 0);
seek(OUT, 0, 0);
print OUT @A;
close(OUT);
0193nobodyさん2006/06/06(火) 15:04:28ID:???
>>190-192
自作CGIを評価するスレ
http://pc8.2ch.net/test/read.cgi/php/1049514428/
01941902006/06/06(火) 15:20:53ID:???
>>193
そちらで質問してきます。
0195nobodyさん2006/06/06(火) 17:58:30ID:???
if($MON == 1|3|5|7|8|10|12)

これ斬新だな。当然Warning出るけど一応動くんだw
0196nobodyさん2006/06/06(火) 18:26:58ID:???
>>195
動くって、意図した通りに動くっていう意味?
0197nobodyさん2006/06/06(火) 18:31:07ID:???
>>196
いや、意図した通りには動かない。だって15だよ。比較の右辺。
0198nobodyさん2006/06/06(火) 18:34:39ID:???
配列(コンマ区切り)の中身を一定の数ごとに折り返して再び配列(コンマ区切り)に
入れ直したいんですが良い方法が浮かびません。
うまく表現できないので例を挙げると、
「@listの中身は20コあって、5コごとに折り返して再び@listに入れ直す」
という意味は、下のようなイメージです。
$list[0] = $list[0] . $list[5];
$list[1] = $list[1] . $list[6];
$list[2] = $list[2] . $list[7];
$list[3] = $list[3] . $list[8];
$list[4] = $list[4] . $list[9];
$list[5] = $list[10] . $list[15];
$list[6] = $list[11] . $list[16];
$list[7] = $list[12] . $list[17];
$list[8] = $list[13] . $list[18];
$list[9] = $list[14] . $list[19];
0199nobodyさん2006/06/06(火) 18:37:06ID:???
法則性を見つけろ
0200nobodyさん2006/06/06(火) 18:45:28ID:???
>>198
そういう処理が必要になった時点で何か間違ってる
0201nobodyさん2006/06/06(火) 18:46:12ID:???
>>195
そらビット演算するだろなw
やりたかったのは
if($MON =~ /^1|3|5|7|8|10|12$/)
こうだろうね
0202nobodyさん2006/06/06(火) 18:47:16ID:???
ぶw もろカッコつけるのわすれたw アホかw
if($MON =~ /^(?:1|3|5|7|8|10|12)$/)
0203nobodyさん2006/06/06(火) 18:56:40ID:???
うるう年の判定も間違ってるし日付関連のモジュールを使うべきだと思った。
0204nobodyさん2006/06/06(火) 19:04:10ID:???
>>199
も、もう少しヒントお願いします。

>>200
例えば、EXCELのフォーマットの関係でCSV出力のときだけ
こういう処理をしたりするのって変ですか?
0205nobodyさん2006/06/06(火) 19:18:40ID:???
ちょと質問です

標準入力の読み込み位置を変更したいのですが
seek STDIN, 0, 0;
ではダメなようでして
なにか術があれば教えてください
0206nobodyさん2006/06/06(火) 19:21:39ID:???
>204
1つのループでいけるかとおもったけど、前半と後半でちゃうのか・・・
処理方法を見直したほうが良いかと思うw
0207nobodyさん2006/06/06(火) 19:23:03ID:???
>>198=204
1行でもできるんでない?

ヒントをいえば、
右側は常に list[n] + list[n+5]
になってて、
その n ってのは、左側を list[i] とすれば、
i が 5回ごとに 10 足されていって、それに、 i 回目を 5 で割ったあまりを足したもの。
0208nobodyさん2006/06/06(火) 19:24:49ID:???
STDIN は前方向にしか進めないですよ

(1) 一旦ファイルに書き出したのを利用する
(2)そんなにでかくないのなら read で読み込んだものを利用する

の2通りがあります。
大きいファイル、環境にも夜でしょうが 5MB あたりを境に (1) か (2) かを使い分ければ良いかと思います。
0209nobodyさん2006/06/06(火) 19:29:08ID:???
>>208
そういうことでしたか
ありがとです
■ このスレッドは過去ログ倉庫に格納されています