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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10 
0369nobodyさん2006/03/29(水) 13:53:27ID:???
無駄な文字列生成しないしな。
0370nobodyさん2006/03/29(水) 14:09:04ID:???
>>368
本気でそう思ってるのか?考え方の矯正をお薦めする。
遅いし、printを繰り返すし、無駄な変数使うし、良いとこなしだ。
レス返されてムキになってる訳じゃなくて、それが素の考え方ならある意味凄い。
0371nobodyさん2006/03/29(水) 14:11:52ID:???
>>362
うちなんか16倍も差が出たよ。
こんだけ早いならjoin使おうかな・・・
ちなみに下の2つでは微妙にmapのが早かった。
print "$_\n" for @array;
print map "$_\n", @arrray;
0372nobodyさん2006/03/29(水) 14:23:46ID:???
>>370
じゃあ、最後の "\n" がはみごになるのは気持ち悪くないの?
これが自然と思うのが Perl 流だというのなら仕方ないけど、
俺はものすごく気持ち悪くて仕方がない。
03733702006/03/29(水) 14:30:31ID:???
>>372
確かに気持ち悪い。でも、組み込み関数を使えるところは使うのが基本だし、
その一つとさっき挙げた数点を比べたら、その一つの点の為に他を犠牲にすることは出来ない。
0374nobodyさん2006/03/29(水) 14:40:23ID:???
363の出した$,が最速だと思うのだが...
0375nobodyさん2006/03/29(水) 14:41:08ID:???
うーん、そういうもんかね。
俺なら、例え 16倍も速度差が出たとしても、
本当にそこがボトルネックで困っているようなケースでないのであれば、
読み下せて意味が明確でわかりやすい方を取るけどな。
0376nobodyさん2006/03/29(水) 14:46:11ID:???
# 投稿コードチェック
if ($regist_key) {
$cd = $in{'code'};
$cd =~ s/\D//g;
if ( $cd =~ m/^\d{5}$/ ) {
$les = $addr;
$les =~ s/\D//g;
$les =~ /^(\d{5})(\d+)/;
$les = $1;
$cod = $cd + $les;
$cod =~ /^(\d{4})(\d+)/;
$cod = $1;
}
if ($cod ne $in{'regikey'}) { $err .= "投稿コードが不正です。<br>"; }
}
03773762006/03/29(水) 14:47:57ID:???
上の続き
# 投稿コード作成
sub key_image {
@num = (0 .. 9);
srand;
foreach (1 .. 5) {
$regikey .= $num[int(rand(@num))];
}
$les = $addr;
$les =~ s/\D//g;
$les =~ /^(\d{5})(\d+)/;
$les = $1;
$nu = $regikey + $les;
$nu =~ /^(\d{4})(\d+)/;
$nu = $1;
# テキストコード表示
print "<input type=text size=5 value=$nu>\n";
}
この中に使われない物は入ってます?
0378nobodyさん2006/03/29(水) 14:51:18ID:???
1,a,林檎
2,a,梨
3,b,西瓜
4,b,イチゴ
5,a,桃

のようなtest.txtというファイルを元に、
2つめの項目がaのを抜き出し表示する為に、


open(IN,"test.txt") || &error("Open Error: $logfile");
while (<IN>) {
    ($no,$type,$name) = split(/,/);
    if ($type eq 'a') {
    print "$name<br>\n";
}
}
close(IN);

とwhileで全行回すしかないのでしょうか?
0379nobodyさん2006/03/29(水) 16:36:14ID:???
>>378
正規表現やgrep等でもOK。

my $in = join( '', <> );
my @result = $in =~ /^\d+,a,.*$/gm;

my @in = <>;
my @result = grep { /^\d+,a,.*$/ } @in;

文法チェックもしてないけど、こんな感じで。
1つめの1行目は、my $in; { undef $/; $in = <>; }
とかの方が丁寧だけど。
0380nobodyさん2006/03/29(水) 16:38:19ID:???
>>379
あ、1個目
- my @result = $in =~ /^\d+,a,.*$/gm;
+ my @result = $in =~ /^(\d+,a,.*)$/gm;
だった。
他にも間違ってるとこあるかも。
0381nobodyさん2006/03/29(水) 17:20:47ID:???
でもそれって全部メモリに読んじゃうよね?

0382nobodyさん2006/03/29(水) 18:46:24ID:???
今時メモリちびちびつかってどうするのかと。
0383nobodyさん2006/03/29(水) 19:24:01ID:???
640KBしか積んでないんだよ
0384nobodyさん2006/03/29(水) 19:54:55ID:???
>>374
100万回でチェック
push (@array, rand) for (1..100000);
print "$_\n" foreach @array; ### 0.91 CPU [3]
print join "\n", @array; ### 0.54 CPU [2]
local $, = "\n"; print @array; ### 5.11 CPU [5]
print map "$_\n", @arrray; ### 0.39 CPU [1]
print $_, "\n" foreach @array; ### 0.93 CPU [4]

local $,が目立って遅かった…
0385nobodyさん2006/03/29(水) 20:27:02ID:???
>>384
まさかとは思うけどベンチマークの測り方知ってるよね
0386nobodyさん2006/03/29(水) 20:58:58ID:???
>>385
まさかとは思うけど、知らずに煽ってないよね?
0387nobodyさん2006/03/29(水) 21:02:09ID:???
>>386
知ってる
ベンチ取るのめんどくさいからやってないけど
$,が遅いとは思わないです><
0388nobodyさん2006/03/29(水) 22:08:29ID:???
use Benchmark;

push @array, rand for 1..100000;

timethese(100,
{
q{print STDERR "$_\n" foreach @array} => sub {print STDERR "$_\n" foreach @array},
q{print STDERR join "\n", @array} => sub {print STDERR join "\n", @array},
q{local $, = "\n"; print STDERR @array} => sub {local $, = "\n"; print STDERR @array},
q{print STDERR map "$_\n", @array} => sub {print STDERR map "$_\n", @array},
q{print STDERR $_, "\n" foreach @array} => sub {print STDERR $_, "\n" foreach @array},
});

print STDERR join "\n", @array: 2 wallclock secs ( 1.84 usr + 0.03 sys = 1.88 CPU) @ 53.33/s (n=100)
print STDERR "$_\n" foreach @array: 16 wallclock secs (11.66 usr + 3.94 sys = 15.59 CPU) @ 6.41/s (n=100)
print STDERR map "$_\n", @array: 22 wallclock secs (19.12 usr + 3.47 sys = 22.59 CPU) @ 4.43/s (n=100)
local $, = "\n"; print STDERR @array: 23 wallclock secs (16.55 usr + 6.75 sys = 23.30 CPU) @ 4.29/s (n=100)
print STDERR $_, "\n" foreach @array: 25 wallclock secs (17.66 usr + 6.83 sys = 24.49 CPU) @ 4.08/s (n=100)
03893882006/03/29(水) 22:12:56ID:???
joinがダントツで速いのは、printが1回で済むから。
0390nobodyさん2006/03/29(水) 22:23:16ID:???
もし宜しければ$,が遅いのはなぜか教えていただけると嬉しいです_ _
わからにゃい。。
0391nobodyさん2006/03/29(水) 23:31:28ID:???
うちでもほぼ同じ結果だった。x86_64 GNU/Linux
# mapブロック版と$"使用版を追加してます。
# 出力結果が同じになるようjoinに,"\n"追加してます。

print STDERR join("\n", @array),"\n": 2 wallclock secs ( 1.47 usr + 0.01 sys = 1.48 CPU) @ 67.57/s (n=100)
local $" = "\n"; print STDERR "@array\n": 2 wallclock secs ( 1.75 usr + 0.01 sys = 1.76 CPU) @ 56.82/s (n=100)
print STDERR "$_\n" foreach @array: 10 wallclock secs ( 7.57 usr + 2.44 sys = 10.01 CPU) @ 9.99/s (n=100)
print STDERR map "$_\n", @array: 13 wallclock secs (10.34 usr + 2.56 sys = 12.90 CPU) @ 7.75/s (n=100)
print STDERR map {"$_\n"} @array: 13 wallclock secs (10.47 usr + 2.54 sys = 13.01 CPU) @ 7.69/s (n=100)
local $, = "\n"; print STDERR @array: 14 wallclock secs ( 8.49 usr + 5.18 sys = 13.67 CPU) @ 7.32/s (n=100)
print STDERR $_, "\n" foreach @array: 15 wallclock secs (10.38 usr + 5.03 sys = 15.41 CPU) @ 6.49/s (n=100)

最初はlocalのせいで遅いのかとも思ったけど違うみたい。
内部で、$"はjoin、$,はmapあたりを使ってるなじゃないかと。
0392nobodyさん2006/03/29(水) 23:58:21ID:???
local $, = "\n"; print @array;
これって省略無しで書くとどんな感じ?
他はなんとなく処理がわかるけど、これだけ判らない。
解説プリーズ。
03933562006/03/29(水) 23:59:36ID:???
仕事から帰ってきて見たら、こんな盛り上がっているとは驚いた…
03943522006/03/30(木) 00:05:57ID:???
うわ、凄い伸びてる。
倒置っていうか、>>358が言うみたいな後置きの事です。
意味不明な言葉を補完してくれた人感謝。

やっぱ覚えておくとよさそうだなぁ。
ただ、書き方が()要るかとか$_とか使い出したりでちょっと面倒なんだよね。
解説してくれてるところが妙に見つからないし、習うより覚えろって事かな。
03953562006/03/30(木) 00:12:08ID:???
>>394
「Effective Perl」オヌヌメ。最近買ったんだけど、例えばforeachとmapとgrepの
明確な使い分けとか、そんなレベルでPerlのセンスを磨いてくれる良書だとオモタ。
後置きについても書いてあったかは忘れたけど、例文にはバンバン登場するので
非常に参考になる。

>>359
その通りだね。括弧書いたのは後でシモタとオモタよ。
0396nobodyさん2006/03/30(木) 00:14:55ID:???
print "$_\n" foreach @array; ### 0.91 CPU [3]
print $_, "\n" foreach @array; ### 0.93 CPU [4]

print STDERR "$_\n" foreach @array: 16 wallclock secs (11.66 usr + 3.94 sys = 15.59 CPU) @ 6.41/s (n=100)
print STDERR $_, "\n" foreach @array: 25 wallclock secs (17.66 usr + 6.83 sys = 24.49 CPU) @ 4.08/s (n=100)

連結って思ったより処理負荷大きいのかな。
気をつけようっと。
0397nobodyさん2006/03/30(木) 00:41:13ID:???
>連結って思ったより処理負荷大きいのかな

Benchmark: timing 10000 iterations of $a .= "a" , $a = $a . "a"...
$a .= "a" : 0 wallclock secs ( 0.17 usr + 0.00 sys = 0.17 CPU) @ 5882.35/s (n=1000)
$a = $a . "a": 85 wallclock secs (84.41 usr + 0.01 sys = 84.42 CPU) @ 11.85/s (n=1000)

うへぇ
0398nobodyさん2006/03/30(木) 00:45:35ID:???
>>396
カンマは連結じゃない希ガス。
0399nobodyさん2006/03/30(木) 00:48:32ID:???
>>394
ちゃんと本買って一から勉強するとかした方が良いと思う。
0400nobodyさん2006/03/30(木) 00:51:51ID:???
げげげ、ピリオドかと思ってたらカンマだったのねorz
0401nobodyさん2006/03/30(木) 01:07:54ID:???
素朴な疑問なんだけど、出力先を STDERR にするのは Benchmark の定石なの?

print STDERR だとバッファリングされずに必ず write(2) するから、
print STDOUT に比べて圧倒的に速度的に不利になると思うんだけど。
0402nobodyさん2006/03/30(木) 01:33:47ID:???
@の後ろにある数字が大きいと速いってこと?
0403nobodyさん2006/03/30(木) 01:50:36ID:???
>>401
で?
比較なんだから別にどうでもいいだろ
0404nobodyさん2006/03/30(木) 01:55:35ID:???
>>401
一回ごとに出力しないとちゃんと繰り返してることにならない。
0405nobodyさん2006/03/30(木) 01:59:04ID:???
>401
そりゃある文ではSTDERRつかって、ある文ではSTDOUT使ってたらベンチに偏りが出るけどさ・・・
条件が同じなら出力先はファイルでもなんでもいいんだよ
0406nobodyさん2006/03/30(木) 02:13:52ID:???
でも確かにそれだと速度差が正確にでないんじゃない?
他の処理のせいで処理自体の差は100/sと50/sの差なのに、
10/sと9/sって差が出てしまったら大差なさそうに感じてしまうし。
0407nobodyさん2006/03/30(木) 02:31:39ID:???
>>405
いやいや、だから、 >>389 が言ってるように、
print (というか write(2)) の回数が多い方が極端に不利になるじゃん、という話。
0408nobodyさん2006/03/30(木) 02:39:02ID:???
>>402
ベンチマークの基本から勉強しろよな


俺もわからないんだけどね
0409nobodyさん2006/03/30(木) 02:40:53ID:???
>>407
で?
比較なんだから別にどうでもいいだろ
0410nobodyさん2006/03/30(木) 03:21:17ID:???
> で?

煽ってるつもりなのだろうか。
0411nobodyさん2006/03/30(木) 05:10:05ID:???
join は内部的に最適化されているから、文字列連結では join を使うべし
ってのが、ラクダ本あたりにもよく出てくるよね。
0412nobodyさん2006/03/30(木) 06:41:01ID:???
@arrayの中身がどれだけ長くなっても、やはりprintを繰り返すよりも
joinの方が圧倒的に速いんだろうか?
0413nobodyさん2006/03/30(木) 07:15:57ID:???
>>412
長くなるほど差が広がると思う
0414nobodyさん2006/03/30(木) 08:50:36ID:???
>>413
でも、@arrayに加えてさらにjoinされる分のメモリが必要になるんだよ?
0415nobodyさん2006/03/30(木) 09:33:15ID:???
机上
04164072006/03/30(木) 10:45:36ID:???
机上と言われるとあれなので、STDERR じゃなくてファイルに書き出してみました。

print FILE join("\n", @array),"\n": 10 wallclock secs ( 8.07 usr + 2.05 sys = 10.12 CPU) @ 9.88/s (n=100)
local $" = "\n"; print FILE "@array\n": 13 wallclock secs (10.10 usr + 2.20 sys = 12.30 CPU) @ 8.13/s (n=100)
print FILE "$_\n" foreach @array: 19 wallclock secs (18.08 usr + 1.20 sys = 19.28 CPU) @ 5.19/s (n=100)
print FILE map "$_\n", @array: 30 wallclock secs (27.93 usr + 1.07 sys = 29.00 CPU) @ 3.45/s (n=100)
print FILE map {"$_\n"} @array: 29 wallclock secs (27.60 usr + 1.23 sys = 28.84 CPU) @ 3.47/s (n=100)
local $, = "\n"; print FILE @array: 13 wallclock secs (10.70 usr + 1.18 sys = 11.88 CPU) @ 8.42/s (n=100)
print FILE $_, "\n" foreach @array: 19 wallclock secs (16.84 usr + 1.16 sys = 18.00 CPU) @ 5.56/s (n=100)

map はどうあがいても遅そうですが、他は join との差がかなり縮まってると思います。
0417nobodyさん2006/03/30(木) 11:19:01ID:???
local $,は早いのか遅いのかどっちなんだw
04184072006/03/30(木) 11:54:18ID:???
>>417
まあベンチマークってそういうもんなんじゃないでしょうか。
机上だけでやっちゃうってのも問題ですが、
ベンチマークを鵜呑みにするのも問題だと思います。
ベンチマークも一つの目安に過ぎないんだと思います。
0419nobodyさん2006/03/30(木) 13:55:21ID:???
まぁ動けばいいよ
この板のレベル的に
04204072006/03/30(木) 14:05:48ID:???
あ、そうそう。
>>405 さん、この結果に関して何かフォローがあればよろしくです。
0421nobodyさん2006/03/30(木) 14:31:39ID:???
>>420
joinが一番早くてmapが遅いということが確認できました
0422nobodyさん2006/03/30(木) 14:52:07ID:???
STDOUTを/dev/nullにリダイレクトして、cmptheseをSTDERRに吐いて確認してみますた。

print map {"$_\n"} @array 13.8/s -- -1% -44% -52% -69% -76% -80%
print map "$_\n", @array 14.0/s 1% -- -43% -51% -69% -75% -79%
print "$_\n" foreach @array 24.4/s 77% 75% -- -15% -46% -57% -64%
print $_, "\n" foreach @array 28.7/s 109% 106% 18% -- -36% -49% -57%
local $, = "\n"; print @array 45.0/s 227% 223% 85% 57% -- -20% -33%
local $" = "\n"; print "@array\n" 56.5/s 310% 305% 132% 97% 25% -- -16%
print join("\n", @array),"\n" 67.6/s 391% 384% 177% 135% 50% 20% --

まぁ、自分はこの差が問題になるよなコードを書くことはないと思うけど。
0423nobodyさん2006/03/30(木) 14:57:20ID:???
ベンチマーク云々は>>375で結論でてるから、もういいよ。
0424nobodyさん2006/03/30(木) 15:31:44ID:???
いや、結論はどうだろうと知っておいて損は無い。
むしろどんどんやってくれ。
0425nobodyさん2006/03/30(木) 15:56:27ID:???
>420
書き方によってスピードに差が出るってのをベンチマークとって分かればいいんだから、
ファイルに書き出した結果もベンチ結果の1つでしょ?
またSTDERRに書き出してたベンチも結果の1つ

君がそれ以上に何が知りたいかのかわからんよ
04264072006/03/30(木) 16:16:27ID:???
>>425
別にあなたに聞いてないんだけど・・・
「何かフォローがあれば」って言ってるので、特になければレス要りませんよ。
0427nobodyさん2006/03/30(木) 19:01:15ID:+BI4fyV2
CGI.pmで複数のパラメータを取得してJcode.pmで変換かませたいんですけど
ひとつひとつを変換するのではなく、一度に変換する良い方法ありませんか?
0428nobodyさん2006/03/30(木) 19:23:03ID:???
1行で済ますことはできますが、バラバラに格納されたデータを
一度に変換する方法など、Perlでなくてもありません。
0429nobodyさん2006/03/30(木) 23:12:22ID:???
WinとFreeBSDとFedoraでベンチしてみたが、全部順位が違った。
それもわずかな差じゃなくて数倍以上。
一体中で何が起きてるんだ…
子ネタ
ttp://itpro.nikkeibp.co.jp/article/NEWS/20060330/233820/
0430nobodyさん2006/03/31(金) 00:19:33ID:???
>407
あなた自分の解釈の間違いに意固地になって必死すぎ
0431nobodyさん2006/03/31(金) 00:27:55ID:???
>>429
どんな違いなのかざっとで良いので公開希望。
0432nobodyさん2006/03/31(金) 00:34:36ID:???
ファイル書き出しはWinが遅いと勝手に予想してみたり・・・
04334072006/03/31(金) 01:04:54ID:???
>>430
間違ってるってわかってるのならどこがどう間違えてるか指摘してくださいよ。
0434nobodyさん2006/03/31(金) 01:42:27ID:???
>>430
遅レスカコイイwwww
0435nobodyさん2006/03/31(金) 01:47:32ID:???
なんでこんなに香ばしくなってんだこのスレは…



Σ
春休みかorz
0436nobodyさん2006/03/31(金) 01:58:45ID:???
途中まではいい流れだったのにな。
変なのが絡みだすとこういう事に。
この板住人は煽り耐性低いというか、言い返さずに入られない人多いよな。
0437nobodyさん2006/03/31(金) 02:11:22ID:???
いちいち自己紹介しなくてもいいよ
0438nobodyさん2006/03/31(金) 02:47:50ID:???
ここまで落ち着けば、良い質問がいくつか来ればスレの流れはとりあえず戻ると思うけど、
この空気じゃなかなか質問がしづらいという悪循環。
0439nobodyさん2006/03/31(金) 13:33:21ID:MWW8UoCr
>>428
その一行を教えてください><
0440nobodyさん2006/03/31(金) 15:01:40ID:???
じゃあ、スルーされちゃった>>392プリーズ。
0441nobodyさん2006/03/31(金) 15:28:24ID:???
>>440
特に何も省略されてないと思われ。

print 演算子の出力フィールドセパレータ (デフォルトは空文字列) を「改行」にし、
@array を print する。

って感じで。
0442nobodyさん2006/03/31(金) 16:06:55ID:???
おお、なるほど。
なんとなく把握できた。

解説感謝。
0443nobodyさん2006/03/31(金) 16:33:00ID:???
>>439
ヒント: 改行入れなければどんなに長くても1行は1行
0444nobodyさん2006/03/31(金) 18:52:18ID:???
まったくcgiとかやったことないんですけど、2chぽい掲示板のが見づらいので自分で変えようと思ったのですが
たとえば
<a href=read.cgi?bbs=$bbs&key=$key&ls=$lslimit&mode=i accesskey=3>?新</a>
とかは携帯から見れる新って書いてあるリンクをおすと#63881に書いてあるコマンドを実行するってことですか?
リンクを押すと新しいレス10件を表示させるようにしたいのですが、そのコマンドがどこに書いてあるのかわからなくて・・。
0445nobodyさん2006/03/31(金) 19:49:56ID:???
すみません、わかりました。
#63〜ってのはエモジのことみたいですね。
0446nobodyさん2006/03/32(土) 01:29:26ID:???
local $, = "\n";
これがわからんかったんで調べた・・・ (知ってる人にはどうでもいいことだろうけど、分からない人も居るだろうし・・・)

$, 自体が特殊変数で、print 関数で表示する際にセパレータとして挿入される値

>>392 の例だと、「配列の要素間に \n を入れる」 という意味


なるほど勉強になりました。
0447nobodyさん2006/03/32(土) 01:31:27ID:???
なんでmyじゃなくて遅いlocalなんだろう?とか、
初心者なので思ったりする。
0448nobodyさん2006/03/32(土) 01:37:06ID:???
特殊変数は local でやる決まり
0449nobodyさん2006/03/32(土) 02:16:23ID:???
勉強になった!
ありがとう。
0450nobodyさん2006/03/32(土) 08:17:31ID:???
ほぇ〜そゆ決まりもあったんですか

勉強になります
0451nobodyさん2006/03/32(土) 09:15:53ID:???
>>416
>>422

目的のアルゴリズム部だけの速度を求めたいのなら、print は一切省いて

join("\n", @array),"\n";
local $" = "\n"; "@array\n";
"$_\n" foreach @array;
map "$_\n", @array;
map {"$_\n"} @array;
local $, = "\n"; @array;
$_, "\n" foreach @array;

とかでいいと思う。デバイスに出力するのが遅いだけでなく、print 関数の使用自体が
遅い可能性もあるし(C言語とかだとそう)。

まぁ、これだと $, を使用したときの正確な値が求められないが、内部的に $, は
そんなにコストがかかっていなさそう。
おそらく内部では、$, ||= ''; (←実際にはCとかで)とでもやって条件分岐なしで処理してそうだし。
実際にベンチをとって確認するのは大切なことだけどね。
0452nitraid2006/03/32(土) 14:06:31ID:G839mIFt
携帯サイトの各キャリア別で振り分けしたいのですが、何か良い方法(CGI等)はありませんか?
The Roomさんの振り分けCGIを使ってみたのですが、最近の携帯ではPCページにアクセスしてしまうようで困っております。
みなさんよろしくお願いします。
0453nobodyさん2006/03/32(土) 14:14:34ID:???
IP帯域
0454nitraid2006/03/32(土) 14:40:58ID:G839mIFt
nobodyさん回答ありがとうございます。
DoCoMo、au、vodafoneどれなのかを判別して振り分けたいのですが、各端末情報を書かなければいけませんか?
よろしくお願いします。
0455nobodyさん2006/03/32(土) 14:53:28ID:???
関係ないけど2006/03/32ってなんだよ?
0456nobodyさん2006/03/32(土) 15:45:13ID:???
>>455
2ちゃんねるは初めての方ですか?
ラウンジ板へどうぞ^^
0457nobodyさん2006/03/32(土) 17:27:19ID:???
誰か日付が03/32になるようにするにはどうすればいいのか教えてくれ
0458nobodyさん2006/03/32(土) 17:28:37ID:???
>>454
host名にdocomoとかついてるから簡単にわからない?
0459nobodyさん2006/03/32(土) 18:52:12ID:???
>>457
s#04/01#03/32#;
0460nobodyさん2006/04/02(日) 13:14:52ID:???
配列やハッシュのリファレンスの入った配列をコピーし、
リファレンス先の値を変更してから、元の配列と比較したいのですが、
リファレンスを用いているために元の配列の値が変更されてしまいます。
何か元の配列の値を変更しない、効率の良い方法はあるでしょうか?
my @S=([1,2,3],[1]);
{
my @T=@S;
$T[0][0] = 0;
#ここで、$T[0][0]==$S[0][0]となってしまいます...
}
0461nobodyさん2006/04/02(日) 14:10:23ID:???
>>460
> リファレンスを用いているために元の配列の値が変更されてしまいます。
という質問に対する答えはディープコピーすればOK。
例えばこうやって:
my @T = map { [@$_] } @S;

自動でやってくれる便利なモジュールもある。
ttp://search.cpan.org/~rdf/Clone-0.20/Clone.pm
PurePerl版: ttp://search.cpan.org/~evo/Clone-PP-1.02/PP.pm

データ量が非常に多い場合はtieで差分を記録して処理するラッパを作ると良いかもしれないが、
オーバーヘッドがあるからこれは実際にやってみないとわからないな。

しかし本当にコピーする必要があるのか?
どうもその質問を見ると何所が書き換わったのかだけが知りたいようにも見えるんだが。
04624602006/04/02(日) 16:55:34ID:???
>>461
ありがとうございます。
最終的に、データ構造全体が必要なのでコピーは必要そうです。
利用しようとしているデータ構造は、>>460で示したものよりもう少し複雑です。
配列のリファレンスと、ハッシュのリファレンスが同じ配列に入っていたり...
mapは初めて知りましたが、何層にもなるデータ構造を完全にコピーするのは難しそうに見えます。
mapの何か応用的な利用法、または別の方法とかはあるのでしょうか。
モジュールが使えればよいのですが、設定が良く分からないので使えませんorz
データ構造はこんな感じです(各要素は適当に省略しています)。:
@S=(
{'a'=>[1,1],'b'=>1},
[{'c'=>[1,2],'d'=>1},{}],
[{},{}]
);
0463nobodyさん2006/04/02(日) 18:07:27ID:???
perlスクリプトからC:\test.exeのようなファイルを実行するには
どのようにすればいいでしょうか。
0464nobodyさん2006/04/02(日) 18:48:20ID:???
exec, system自分の用途にあわせてどうぞ
04654632006/04/02(日) 18:54:08ID:???
>>464
なるほど。ありがとうございました。
0466nobodyさん2006/04/02(日) 18:56:57ID:???
print $_ for a..z ; みたいなこと出来ませんか?
0467nobodyさんNGNG
試してみてから書き込みましたか?
0468nobodyさん2006/04/02(日) 19:11:16ID:???
>>467
ゴメン
strict外したらでけた
■ このスレッドは過去ログ倉庫に格納されています