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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
0002nobodyさん2006/07/27(木) 17:11:03ID:???
関連スレ
CGI: Common Gateway Interface part 13
http://pc8.2ch.net/test/read.cgi/php/1126436361/

【Perl,CGI】参考書籍 第三版
http://pc8.2ch.net/test/read.cgi/php/1030209573/

【Perl】ファイルロック(排他処理)について語ろう
http://pc8.2ch.net/test/read.cgi/php/1024795138/

★負荷軽減対策委員会(Perl、PHP)★
http://pc8.2ch.net/test/read.cgi/php/1034645635/

CGIに依存しないPerlの話題一般/Part2
http://pc8.2ch.net/test/read.cgi/php/1030548610/

★三 【 スクリプト改造工房 PART 9 】 ★三
http://pc8.2ch.net/test/read.cgi/php/1143834740/

【 スクリプト改造依頼スレ 】(丸投げ) part5
http://pc8.2ch.net/test/read.cgi/php/1141174205/
0003nobodyさん2006/07/27(木) 17:14:18ID:???
[過去ログ] 1 of 5

Part1 http://tako.2ch.net/test/read.cgi?bbs=perl&key=957208980 参照不能
 DAT: http://tako.2ch.net/perl/dat/957208980.dat
Part2 http://tako.2ch.net/test/read.cgi?bbs=perl&key=971817087 参照不能
 DAT: http://tako.2ch.net/perl/dat/971817087.dat
Part3 http://tako.2ch.net/test/read.cgi?bbs=perl&key=979894521 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part4 http://tako.2ch.net/test/read.cgi?bbs=perl&key=984430156 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part5 http://pc.2ch.net/php/kako/988/988728069.html
Part6 http://pc.2ch.net/php/kako/996/996075607.html
Part7 http://pc.2ch.net/php/kako/1000/10002/1000267444.html
Part8 http://pc.2ch.net/php/kako/1003/10039/1003900311.html
Part9 http://pc.2ch.net/php/kako/1009/10095/1009549309.html
Part10 http://pc.2ch.net/php/kako/1014/10145/1014556702.html
0004nobodyさん2006/07/27(木) 17:16:02ID:???
[過去ログ] 2 of 5

Part11 http://pc.2ch.net/php/kako/1017/10172/1017201229.html
Part12 http://pc.2ch.net/php/kako/1019/10199/1019917048.html
Part13 http://pc.2ch.net/php/kako/1022/10227/1022731565.html
Part14 http://pc.2ch.net/php/kako/1026/10269/1026977659.html
Part15 http://pc.2ch.net/php/kako/1028/10288/1028816385.html
Part16 http://pc.2ch.net/php/kako/1032/10320/1032070299.html
part17 http://pc.2ch.net/php/kako/1034/10345/1034583844.html
part18 http://pc.2ch.net/php/kako/1037/10377/1037797479.html
part19 http://pc.2ch.net/php/kako/1042/10422/1042260745.html
part20 http://pc2.2ch.net/php/kako/1044/10447/1044717887.html (タイトルに19と誤記)
0005nobodyさん2006/07/27(木) 17:16:41ID:???
[過去ログ] 3 of 5

part21 http://pc2.2ch.net/php/kako/1047/10479/1047980851.html
part22 http://pc2.2ch.net/php/kako/1050/10503/1050369328.html
part23 http://pc2.2ch.net/php/kako/1053/10530/1053051519.html
part24 http://pc2.2ch.net/php/kako/1054/10549/1054992610.html
part25 http://pc2.2ch.net/php/kako/1056/10567/1056730690.html
part26 http://pc5.2ch.net/php/kako/1059/10590/1059043704.html
part27 http://pc5.2ch.net/php/kako/1060/10608/1060808783.html
part28 http://pc5.2ch.net/php/kako/1063/10635/1063562491.html
part29 http://pc5.2ch.net/php/kako/1066/10662/1066286828.html
part30 http://pc5.2ch.net/test/read.cgi/php/1069846177/
0006nobodyさん2006/07/27(木) 17:19:01ID:???
[過去ログ] 4 of 5

part31 http://pc5.2ch.net/test/read.cgi/php/1072896288/
part32 http://pc5.2ch.net/test/read.cgi/php/1075545279/ (タイトルに31と誤記)
part33 http://pc5.2ch.net/test/read.cgi/php/1078076768/
part34 http://pc5.2ch.net/test/read.cgi/php/1081148490/
part35 http://pc5.2ch.net/test/read.cgi/php/1085557731/
part36 http://pc5.2ch.net/test/read.cgi/php/1089779036/
part37 http://pc5.2ch.net/test/read.cgi/php/1093106507/
part38 http://pc5.2ch.net/test/read.cgi/php/1097158988/
part39 http://pc5.2ch.net/test/read.cgi/php/1101522903/
part40 http://pc5.2ch.net/test/read.cgi/php/1106816922/
0007nobodyさん2006/07/27(木) 17:19:49ID:???
[過去ログ] 5 of 5

part41 http://pc8.2ch.net/test/read.cgi/php/1110383236/
part42 http://pc8.2ch.net/test/read.cgi/php/1116970588/
part43 http://pc8.2ch.net/test/read.cgi/php/1123777607/
part44 http://pc8.2ch.net/test/read.cgi/php/1129477637/
part45 http://pc8.2ch.net/test/read.cgi/php/1134049707/
part46 http://pc8.2ch.net/test/read.cgi/php/1137518266/
part47 http://pc8.2ch.net/test/read.cgi/php/1141195171/
part48 http://pc8.2ch.net/test/read.cgi/php/1146042050/
part49 http://pc8.2ch.net/test/read.cgi/php/1149017548/
part50 http://pc8.2ch.net/test/read.cgi/php/1153987463/ (前スレ)

part44-621氏による過去ログ倉庫
ttp://user.ftth100.com/mirrorhenkan/perl/
0008nobodyさん2006/07/27(木) 17:20:53ID:???
ム板Perlスレより 1 of 2

[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www.site-cooler.com/kwl/perl/

[本]
リャマ: http://www.oreilly.co.jp/books/4873111269/
駱駝: http://www.oreilly.co.jp/books/4873110963/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/books/4873112028/

[オンラインマニュアル] (追加)
最新のドキュメント: http://search.cpan.org/~nwclark/perl-5.8.8/
perl5.8.xのドキュメント(一部): http://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: http://www.cpan.jp/search.cgi
perldoc.jp: http://www.perldoc.jp/
Perldoc.com: http://www.perldoc.com/
0009nobodyさん2006/07/27(木) 17:21:52ID:???
ム板Perlスレより 2 of 2

[モジュール]
CPAN.com: http://search.cpan.org/
河馬屋二千年堂: http://homepage3.nifty.com/hippo2000/

[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/
Perlの小技: http://homepage3.nifty.com/hippo2000/perltips/index.htm

[Perl5.8Unicodeメモ]
http://www.pure.ne.jp/~learner/program/Perl_unicode.html
http://www.namazu.org/~tsuchiya/perl/perl-5.8.html
http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
0010nobodyさん2006/07/27(木) 17:55:17ID:????BRZ(1002)
乙
0011nobodyさん2006/07/27(木) 19:47:33ID:0k8QdmRt
文字列置換の処理で質問です。
変数を途中で使いたいのですが、どういう方法がありますでしょうか?

$fruit =~ s/みかん/りんご/; #OK

$apple = "りんご";
$fruit =~ s/みかん/$apple/; #NG

$apple = "りんご";
$RegExp = "s/みかん/$apple/";
$fruit =~ $RegExp; #NG
0012nobodyさん2006/07/27(木) 19:59:13ID:???
>>11
>$apple = "りんご";
>$fruit =~ s/みかん/$apple/; #NG
これはNGにならない。

$apple = "りんご";
$RegExp = "s/みかん/$apple/";
eval "¥$fruit =~ $RegExp";
0013nobodyさん2006/07/27(木) 20:03:14ID:???
>1 乙〜
0014nobodyさん2006/07/27(木) 20:13:21ID:???
>>12
すんません、確かにNGではなく変数使えました。
$in{"select_fruit"} でフォームからの値が入ってなかったようです・・・

全体をevalするのがあるんですね、JavaScriptで多少覚えたので理解できます。
確か処理が遅いから、やらないほうがいいですよね?

無難に>>11の2番目の方法にしておきます。
0015nobodyさん2006/07/27(木) 20:39:57ID:???
ファイルを読み込むときに、特定の文字列1と文字列2の間の部分だけ
読み込むことってできないですかね?
やはり一度全部読み込んでから、
特定の文字列1より前と文字列2より後の部分を削除する
という方法でやるしかないでしょうか?
0016nobodyさん2006/07/27(木) 20:48:35ID:???
>>15
>ファイルを読み込むときに、特定の文字列1と文字列2の間の部分だけ
>読み込むことってできないですかね?
できる。
正確にはお察しのとおり、
1.ファイルを読み込みながら文字列1を探す。このとき読み込んだ文字列は保存せずに捨てる
2.1が見つかったらファイルを読み込みながら文字列2を探す。このとき読み込んだ文字列は変数に収納。
3.文字列2が見つかって終わり。
0017152006/07/27(木) 20:58:10ID:???
>>16
手順の説明ありがとうございます。
ただ自分としてはファイルの中身全部読み込んで
正規表現で文字列1と2をマッチさせてそれぞれの前後を捨てる
という方法を考えていたので、
>>16のようなスマートなやり方が分かりません。
もう少しヒントというか具体的な関数名を教えてもらえないでしょうか?
0018nobodyさん2006/07/27(木) 21:14:10ID:???
while (<FH>) {
 next unless /文字列1/ .. /文字列2/;
 読み込む;
}

文字列1, 文字列2 自体が要らないなら、nextの次の行あたりで捨てて。
0019nobodyさん2006/07/27(木) 21:18:18ID:???
アルゴリズムは状況による。
全体のファイルのサイズはどれほどなのかとか
読み込みたい中身の文字列の割合はどのくらいなのかとか
対象文字列の判定はどのくらい厳密にやらなければならないのか
(たとえば "このように引用された文字列" を探したいときに、
 "このように\"エスケープされた引用符" をどう扱うのか
  これは正規表現でもいっしょ。)

なので正規表現みたいに一行でスパッとというわけにはいかない。
そもそもどういう状況でその操作が書いてみると他のより効率的な手段を教えてもらえるかもしれない。

まぁ1kbyteそこらのファイルからなら単純に読み込んで正規表現使えばオケ
0020152006/07/27(木) 21:43:03ID:???
>>18
なるほど、nextを使って文字列にマッチしない限り次の処理へ進ませないわけですか。
ただ、文字列1と2が別の行にある場合は分けて処理する必要があるわけですね。
あいがとうございました。

>>19
後出し情報ばかりになってしまいますが、現在扱おうとしているファイルは
[00001]
情報A
情報B
[00002]
情報C
というように番号(重複なし)だけの行と情報が入ってる行があるファイルで
サイズはまちまちで大きいものだと100Kbyte近くあります。
そのうち特定の番号の間の情報だけを抽出したいと考えています。
そこで、ファイルの中身全部を$logに格納して

$start = '開始番号';
$end = '終了番号';
$log =~ s/$end.+/$1/;
$log =~ s/.+$start/$1/;
番号だけの行削除;

というような処理を考えていたのですが、
>>18の方法の方がメモリ消費を抑えられそうですね。
まずはやってみます。ありがとうございました。
また何か妙案があれば是非ともお願いします。
0021nobodyさん2006/07/27(木) 21:46:47ID:???
>>20
RDBMS とか使えば?
0022nobodyさん2006/07/27(木) 22:02:11ID:???
>>20
>>18 は文字列1,2 が別の行にある場合でも動く
0023152006/07/27(木) 22:54:27ID:???
>>22
ま!まじですか!!
早速やってみます!(ノ∀`)アチャー
0024nobodyさん2006/07/27(木) 23:18:59ID:1uzwaimq
こんばんわ。趣味でいじってて思いました。
年月日時分秒の計算がもっとらくに出来たらいいのにと。

print "こうなればいいのに" if 20060727121000 - 20060727120950 == 10

例えば時分秒用のマイナス演算子があれば・・・・・
0025nobodyさん2006/07/27(木) 23:28:20ID:???
>>24
そういうオブジェクトを作れば、可能かと
0026nobodyさん2006/07/27(木) 23:29:08ID:???
つ http://search.cpan.org/~drolsky/DateTime-0.32/lib/DateTime/Duration.pm
0027nobodyさん2006/07/27(木) 23:43:22ID:???
HTMLエスケープ用のルーチンをライブラリに作ってありました。
ずっと昔のライブラリです。

$a = hoge::escape_h($a);
@a = hoge::escape_h(@a);
%a = hoge::escape_h(%a);
$a = hoge::escape_h($a); #scalarref
$a = hoge::escape_h($a); #arrayref
$a = hoge::escape_h($a); #hashref

でも全てうまく行くようにしたいのです。
用は引数がスカラか配列かハッシュか、リファレンス(どのタイプか)なのかを
チェック入れてif分岐でもすればいいとおもいますが、どうやってチェックするのか。
そこで行き詰ってます。宜しくお願いします。



0028nobodyさん2006/07/27(木) 23:47:50ID:???
>>27
>@a = hoge::escape_h(@a);
>%a = hoge::escape_h(%a);
この2つの区別はつかないよ。
他のは大丈夫だけど。
リファレンスの区別は ref を使う。
0029272006/07/27(木) 23:51:33ID:???
>>28
やっぱりさすがにハッシュと配列の区別なんて無理ですよね。
同じですもんね。

スカラーか配列かはどうすればいいですか?
やっぱり@_の要素数が1か複数かで見るのでしょうか?
0030152006/07/27(木) 23:57:33ID:???
>>18>>22
バッチリできました!
ありがとうございました!
でも、next unless /文字列1/ .. /文字列2/;
の動きが分からずじまい。
ファイルハンドルで1行ずつ読み込んでnextをかけて行くのに
なぜ複数行に渡っても処理ができてるのか不思議です。
たぶん条件式をきちんと解釈できてないんだろうなぁ。
こんな式初めて見るので。
暇な方居ましたら、解説してやって下さい。
0031nobodyさん2006/07/27(木) 23:58:58ID:???
eval 使って、$a[1] を強制的に読み込みを試行してエラーが帰ってきたなら
スカラー、読み取れたなら配列。
ちょっと強引過ぎる気もしますが・・・
0032nobodyさん2006/07/28(金) 00:12:00ID:???
> >@a = hoge::escape_h(@a);
> >%a = hoge::escape_h(%a);
> この2つの区別はつかないよ。

デマですね。
0033nobodyさん2006/07/28(金) 00:47:28ID:???
>992 名前:nobodyさん[] 投稿日:2006/07/27(木) 09:50:11 ID:1uzwaimq
>trust::error_print() if $form{test} =~ /\D|\d{2}/;
穴は防げてるよ。どういう意味かにもよるけど
/^\d$/ or trust::error_print();
とか!~とかunlessの方がわかりやすかったりしない?

>>29
@_はループでリファレンスは再帰って形になるんじゃないかな
sub escape {
 my @vals = @_;
 for(@vals){
  if(ref eq "ARRAY"){ # このへんをelsifで
   $_ = [ escape(@$_) ];
  }else{
   $_ = エスケープ処理($_);
  }
 }
 wantarray ? @vals : $vals[0];
}
0034nobodyさん2006/07/28(金) 01:23:03ID:???
>>32
はいはい。コーディングしてみろよ。
0035nobodyさん2006/07/28(金) 01:26:20ID:???
>>30
範囲演算子をスカラーコンテキストで使うと、内部状態を内包したスイッチのように振舞うよ。
ちょうど最近みかけた解説。
ttp://d.hatena.ne.jp/palmo/20060724/rangeop
0036nobodyさん2006/07/28(金) 08:36:07ID:???
>>20
もう解決したっぽいからどーでもいいんだけど、例えば、
{
open 略;
local $/ = "[00001]";
<FH>; # [00001] までのは捨てる
$/ = "[00002]";
my $log = <FH>; # [00001] の次 〜 [00002] まで取る
close (FH);
}
で 「情報A 情報B」 が取れないかな?
0037nobodyさん2006/07/28(金) 10:40:17ID:asi0sNZ0
open FH,"test.csv";
while (<FH>){...}
色々な処理
close FH;

色々他にもループ処理をしていまして、無限にならないようにちょこちょこ防止コードを
入れています。
それでtest.csvの行数が$form{get}に足らない場合にもエラー終了したいのですが。

my @test = <FH>;

ということをしたくありません。
scalar <FH>やlength <FH>
とやればいけると思ったのですが、一行目が取り出されてしまいます。
まあ配列じゃなくてあくまで行演算子?なので当然といえば当然ですが。

何かいい智恵はありませんでしょうか?
0038nobodyさん2006/07/28(金) 10:48:11ID:???
カウンタを用意すればいいだけかと思う
0039372006/07/28(金) 11:25:15ID:asi0sNZ0
>>38
いや一行で、イチイチ変数に読み込まずとか・・
scalar @test;
くらい簡潔にいけないかと思ってました。
でもむりなようですので配列に読み込むことでもうあきらめました。

連続ですいませんが他の疑問がありますのでお願いします。
http://perldoc.jp/docs/modules/Text-CVS_XS-0.23/Text-CVS_XS-0.23.pod
このモジュールをcsvファイルを扱う時にいつも使ってます。
my $csv = new Text::CSV_XS({ binary => 1 , "always_quote" => 1});
これでやってます。

$form{value} =~ s/\n/\t/g;
悲しいことにいつもこれやってます。このモジュールは改行文字をクォートしてくれないのですよね。
自分で読んでもどうも改行文字は自分で痴漢する以外にないと思うのですが、
中途半端な自分の勘違いなのかもしれないので詳しい人お願いいたします。
0040nobodyさん2006/07/28(金) 11:46:38ID:???
>>27
プロトタイプ使ってリファレンス受け取るサブルーチンにすれば
呼び出し側では字面上はスカラー/配列/ハッシュをそのまま
渡しているように書ける。あとはrefで何のリファレンスか調べる
ことができるのでなんとでもなるだろう。


% cat cat foo.pl
cat: cat: No such file or directory
sub foo (\[$@%]) {
my($x) = @_;

printf "ref(\$x)=%s\n", ref($x);
}

my $x = 'scalar a';
my @x = ('array', 'a');
my %x = (hash => 'a');

foo($x);
foo(@x);
foo(%x);

% perl foo.pl
ref($x)=SCALAR
ref($x)=ARRAY
ref($x)=HASH
0041nobodyさん2006/07/28(金) 11:56:20ID:???
>>40
それだとリファレンスを渡した時に
一度デリファレンスして調べないといけないね
0042nobodyさん2006/07/28(金) 12:20:45ID:???
cgiってどんどん書き換えていきますよね。
ちょっともう自分で全ての把握をするのが難しくなってしまいました。

local.libっていうライブラリに色々作ってあるんですが、
その中にsub slash_printfer{}というものがあります。
そのサブルーチンの名前をsub slash{}に変えたいのです。

でもそのサブルーチンを使ってるページを全て書き直すのは骨が折れます。
というか100以上のファイルをなんてやりたくないですし。
置換ソフトでやっても最終的には全てのファイルの動作チェックを入れないといけなくなっちゃいますのでキツイです。

二つの名前を持つサブルーチンは作れませんか?
sub slash or slash_printfer{}
みたいにしてどちらで呼ばれてもこのサブルーチンが動くというような。
0043nobodyさん2006/07/28(金) 12:22:48ID:???
ちなみに
sub slash_printferが呼び出されたらslashを呼んでslashからの返りを受けて
呼び出し元に返すといったやりかたは断固として拒否します。
0044nobodyさん2006/07/28(金) 12:31:11ID:???
> sub slash_printferが呼び出されたらslashを呼んでslashからの返りを受けて
逆ならいいべ。
sub slash{
  return slash_printfer();
}
つかそもそも
> そのサブルーチンの名前をsub slash{}に変えたいのです。
と。
0045nobodyさん2006/07/28(金) 12:31:49ID:???
最後の行だけに反応。

my $hoge = my $foo = sub () { print 'hage' . "¥n" ; } ;
$hoge->() ;
$foo->() ;

local *hoe = local *moe = sub () { print 'moeeeee' . "¥n" ; } ;
&hoe ;
&moe ;

0046nobodyさん2006/07/28(金) 12:42:56ID:???
レスは断固として拒否します
0047422006/07/28(金) 13:02:54ID:???
>>44
参りました^^;
なんか笑ったら疲れが少しだけ抜けたかも・・・軽く感動した。
0048nobodyさん2006/07/28(金) 13:23:00ID:???
>>37
ループしながらread()で読んで、改行を数える手も。

>>42
>>45も出してるけど、型グロブもあるよ。
use strict;
use vars qw(*slash);

local *slash = \&slash_printfer;
slash();
exit;

sub slash_printfer {
print "printfer!\n";
}
0049nobodyさん2006/07/28(金) 14:30:26ID:???
>>48
うちも型グロブ使う・・・
local にするのはなんか意味があるのん?
0050nobodyさん2006/07/28(金) 14:52:36ID:???
>>49
myにして実行すればわかる。
0051nobodyさん2006/07/28(金) 15:06:23ID:???
>>50
いや my にはしないけどさ、グローバル変数が一番上なとこで local にする意味あるのかなと。
0052nobodyさん2006/07/28(金) 16:49:40ID:???
>>51
変数を最初に使うとき、宣言を必ず行うという癖。
意味は保守性を上げるぐらいだと思う。
0053nobodyさん2006/07/28(金) 16:52:16ID:???
localは宣言なのかという疑問が...
0054nobodyさん2006/07/28(金) 16:57:19ID:???
そういえばすぐ上でuse varsかけてるからlocalしなおしてるのは謎。
0055nobodyさん2006/07/28(金) 17:04:08ID:???
癖かよwww じゃあまあいいやw
0056nobodyさん2006/07/28(金) 17:41:39ID:???
>>53
表現変ですか?
どのように表現するのかご教示お願いします。

# local()だけを指すなら演算子だけどさ。

>>54-55
トップレベルで宣言はしないもの?
スタイルが違いすぎるかなぁ。
0057nobodyさん2006/07/28(金) 17:48:13ID:???
トップレベルでの local は意味あるのかなあ?、って感じ。
いくつかモジュール見たけど、そういう風に書いてるのみたことなかったもんで。
まああってもなくても問題ないからどうでもいいかw

use vars qw(*slash); ← これも別になくても通るよね。
0058nobodyさん2006/07/28(金) 17:54:13ID:???
どっかにrequireして使うかもしれないならグローバルのスコープでも
myなり何なりしておくのはよさげ。
0059nobodyさん2006/07/28(金) 17:55:59ID:???
型グロブだから全部要らないじゃんってことですね。
はい、その通りです。
0060nobodyさん2006/07/28(金) 18:00:29ID:???
>>58 言いたいことは分かるけど、ちょっと流れを読んでくれ(笑)
0061nobodyさん2006/07/28(金) 18:04:01ID:???
そもそもライブラリの中身なのかorz
0062nobodyさん2006/07/28(金) 20:58:31ID:???
>>35
初めて知った。
使い方によっては便利そうだねぇ。
0063nobodyさん2006/07/29(土) 23:54:33ID:???
local が宣言でないというのは use strict してみりゃわかります。
local は既存の変数の値だけを一時的に差し替えて利用するためのアレですから。
0064nobodyさん2006/07/30(日) 08:37:54ID:kTzF8iv+
key %hash
この配列のキーはqw/1 2 3 4 5.../のようになってます。
でもqw/1 3 4 5 6 10.../のようにトビトビになってる場合もあります。

key %hashのキーを参照して、まだ存在してないキーの中から一番数字が若いものが(0以下除外)
いくつになるかを調べるにはどうすればいいでしょうか?

forとexistsを使う方法を自分で考えましたが、ちょっとforを使いたくありません。
0065nobodyさん2006/07/30(日) 09:19:54ID:???
>>64
$key = (sort { $a <=> $b } grep ($_ > 0, keys %hash))[0];
0066nobodyさん2006/07/30(日) 09:21:13ID:???
って存在してないキーか ('A`) 全然違った
0067nobodyさん2006/07/30(日) 09:37:19ID:???
Keyの範囲を仮定できるならバイナリーサーチ
0068642006/07/30(日) 09:37:20ID:kTzF8iv+
for使っちゃいました。m(__)m
>>65
せっかくなのにすいません。
普通に安全なforだったことに気付いたのでいいやってことで。

変わりに別の質問がしたいのですが、CGIで一番面倒なことはエスケープだと最近思うのですが。
チャット、掲示板、〜ファイル、〜ファイル、〜ファイル・・・・
何をやるにも表示の時にはエスケープ。
書き込む前には内容のチェック。

mysqlを思い出しまして。まあmysqlを使うほどではないときの法が多くて。
でもそんな時に例えば相手が送ってきた文字列のデータ型が何かをチェックしてくれるボジュールとかあれbなと。

@form{qw/name count ip address tel memo time/};
これら全て自分で毎度「これには何が入っていてはいけなくて・・・」とか書くのがめんどうってことです。
妄想モジュールのオブジェクト->data型(数字のみ,@form{qw/count tel time/})
みたいにするとチェックできるとか。数字のみであるかどうかをチェックみたいな。
0069672006/07/30(日) 09:39:53ID:???
俺、全然ダメじゃん。寝る。
0070nobodyさん2006/07/30(日) 09:52:10ID:???
>>68
Data::FormValidator
0071nobodyさん2006/07/30(日) 09:53:02ID:???
>>64
すでに解決したかもしれんが。

my $ret = 0;
$ret = ++$_ while exists $hash{$ret};
0072nobodyさん2006/07/30(日) 09:57:59ID:???
>>64
こういう処理で for とか while とかのループ使わないって条件だったらひどいことになるなーw
grep でやろうと考えたけど煩雑でやめた。
0073nobodyさん2006/07/30(日) 09:59:34ID:???
my $test = \@test{qw/a b c d/};
こうすると$testの中にリファレンスが入るけどどうもスカラー型なんだよね。それも$test{d}の中身が入る。
my $test = [@test{qw/a b c d/}];
こうすればちゃんと配列リファレンスではいる。

どういう理屈だろこれ。
0074nobodyさん2006/07/30(日) 10:01:25ID:???
>>69
いやいや。もう朝だよ・・・頑張れよ。遊びに行こうぜ!
0075nobodyさん2006/07/30(日) 10:03:43ID:???
>>73
前者は、

my $test = \( @test{qw/a b c d/} );

になるんじゃないかな。
my $val = ( list ... );
で最後の値が代入される。

後者は無名配列へのリファレンス。
0076732006/07/30(日) 10:15:01ID:???
>>75
なるほど〜。
でも
\@testは\(@test)解釈されないのを聞くのは・・・無粋だよね。
そういう仕様なんだもんね。

タンキウス!
■ このスレッドは過去ログ倉庫に格納されています