Perlについての質問箱 28箱目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/10/31(火) 14:52:21"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc8.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
http://www.perl.org/get.html
● 2006/10/31現在の最新版: 5.8.8
● 2006/10/31現在の開発版: 5.9.3
前スレ
Perlについての質問箱 27箱目
http://pc8.2ch.net/test/read.cgi/tech/1157874614/
リンク集は>>2-3
過去スレは>>4
0002デフォルトの名無しさん
2006/10/31(火) 14:53:20Perlプログラミング講座: 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/
0003デフォルトの名無しさん
2006/10/31(火) 14:54:50[モジュール]
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
0004デフォルトの名無しさん
2006/10/31(火) 14:55:481 ttp://pc.2ch.net/tech/kako/1017/10177/1017736187.html
2 ttp://pc3.2ch.net/tech/kako/1033/10336/1033688230.html
3 ttp://pc2.2ch.net/tech/kako/1041/10412/1041205885.html
4 ttp://pc2.2ch.net/tech/kako/1048/10485/1048519394.html
5 ttp://pc5.2ch.net/tech/kako/1053/10530/1053053082.html
6 ttp://pc5.2ch.net/tech/kako/1060/10606/1060689008.html
7 ttp://pc2.2ch.net/test/read.cgi/tech/1068051036/
8 ttp://pc2.2ch.net/test/read.cgi/tech/1074151549/
9 ttp://pc5.2ch.net/test/read.cgi/tech/1079114157/
10 ttp://pc5.2ch.net/test/read.cgi/tech/1085564875/
11 ttp://pc5.2ch.net/test/read.cgi/tech/1090889189/
12 ttp://pc5.2ch.net/test/read.cgi/tech/1094579428/
13 ttp://pc5.2ch.net/test/read.cgi/tech/1097851764/
14 ttp://pc5.2ch.net/test/read.cgi/tech/1101649274/
15 ttp://pc5.2ch.net/test/read.cgi/tech/1105953092/
16 ttp://pc8.2ch.net/test/read.cgi/tech/1111034732/
17 ttp://pc8.2ch.net/test/read.cgi/tech/1117870308/
18 ttp://pc8.2ch.net/test/read.cgi/tech/1121804136/
19 ttp://pc8.2ch.net/test/read.cgi/tech/1126977805/
20 ttp://pc8.2ch.net/test/read.cgi/tech/1131286411/
21 ttp://pc8.2ch.net/test/read.cgi/tech/1134327348/
22 ttp://pc8.2ch.net/test/read.cgi/tech/1138519327/
23 ttp://pc8.2ch.net/test/read.cgi/tech/1141742901/
24 ttp://pc8.2ch.net/test/read.cgi/tech/1146022352/
25 ttp://pc8.2ch.net/test/read.cgi/tech/1149259409/
26 ttp://pc8.2ch.net/test/read.cgi/tech/1153412251/
27 ttp://pc8.2ch.net/test/read.cgi/tech/1157874614/
0005デフォルトの名無しさん
2006/10/31(火) 18:01:24>>1乙
0006デフォルトの名無しさん
2006/10/31(火) 18:12:14乙
罰ゲームで新スレたてて誰も慰みの言葉かけてくれなきゃ腐るわなw
0007デフォルトの名無しさん
2006/10/31(火) 22:02:46いまきただけだけどw
0008デフォルトの名無しさん
2006/10/31(火) 22:22:300009前スレ992
2006/11/01(水) 00:18:14それは遅いと思い込んでいました。ありがとうございました。
0010デフォルトの名無しさん
2006/11/01(水) 00:19:20好みによるだろうけど(´・ω・)
my (@head, @body);
while (<FH>) { push @head, $_; last if /^$/m; }
while (<FH>) { push @body, $_; }
0011デフォルトの名無しさん
2006/11/01(水) 00:23:09while (<FH>) { (/^$/) ? last : push @head, $_ }
while (<FH>) { push @body, $_ }
メールの処理かね。
0012デフォルトの名無しさん
2006/11/01(水) 00:50:04(/^$/ .. 0) ? push @body, $_ : push @head, $_ while (<FH>);
0013前スレ992
2006/11/01(水) 00:56:520014デフォルトの名無しさん
2006/11/01(水) 01:02:40つ「Win32-IE-Mechanize」
http://search.cpan.org/~abeltje/Win32-IE-Mechanize-0.009/lib/Win32/IE/Mechanize.pm
0015デフォルトの名無しさん
2006/11/01(水) 01:03:39local $/ = "\n\n";
push @retsu, <FH>;
@hai = split /(\n)/, shift @retsu, -1;
# ネタなので効率とかは知らん
0016デフォルトの名無しさん
2006/11/01(水) 01:05:22誰ひとりベンチなんか計らずにポストしてると思うがなw
0017デフォルトの名無しさん
2006/11/01(水) 02:26:04while (<FH>) {/[^\s]/ ? push (@head,$_) : last;}
@body = <FH>;
0018デフォルトの名無しさん
2006/11/01(水) 02:39:50$file="tes.txt";
$outfile="k.txt";
open (IN, $file) or die "$!";
open (OUT, ">$outfile") or die "$!";
$file = ~s/ABC/XYZ/g;
print out $file = ~s/ABC/XYZ/g;
close (IN);
close (OUT);
全く意味わからんのですが、ファイルを開いてABCをXYZに検索置換してk.txtに保存って
どうやるのだろう
0019デフォルトの名無しさん
2006/11/01(水) 03:06:42>>2
0020デフォルトの名無しさん
2006/11/01(水) 03:23:062つの配列があって10%の確立でどっちかの配列を選ぶプログラムを書きたいんですが、
どうやればいいですか?
エロイ人お願いします。
0021デフォルトの名無しさん
2006/11/01(水) 03:38:23while (<TEXTFILE>) {
s/ABC/xyz/g;
print "$_\n";
}
こんな感じの物があった。
0022デフォルトの名無しさん
2006/11/01(水) 03:39:40日本語でおk
002321
2006/11/01(水) 03:56:31#!/Perl\bin\perl
$CSfile="CSfile.csv";
$TXfile="TXfile.txt";
$outfile="outfile.txt";
open (INTEXT, $TXfile) or die "$!";
open (INCSV, $CSfile) or die "$!";
open (OUT, ">$outfile") or die "$!";
while (<INCSV>) {
# 改行コードの除去
chomp ($_);
# 各行をカンマ区切りで分割
@data = split(/,/, $_);
while (<INTEXT>) {
s/$data[0]/$data[1]/g;
print OUT "$_";
}
}
# ファイルハンドルを閉じる
close(INTEXT);
close (INCSV);
close (OUT);
どこかヘンですか?
0024デフォルトの名無しさん
2006/11/01(水) 04:05:11まあ、上では while (<INTEXT>) { } は一回しか実行されないあたりとか大丈夫かな、っては思う。
0025デフォルトの名無しさん
2006/11/01(水) 04:11:42$TXfileを最初に全部読み込んどけ。
0026デフォルトの名無しさん
2006/11/01(水) 04:12:24あぁそれですねー
どうすれば、動くようになりますかね?
0027デフォルトの名無しさん
2006/11/01(水) 04:35:26どこに問題があるかは分かった?
INCSVを読んだあとINTEXTの置換に取りかかってて、そこまではまあ悪くない。
けどINCSVの1行目のループでINTEXTを最後まで読んじゃってるでしょう。
ファイルの読み書きにはファイルポインタっていう「しおり」みたいなのがあるのは理解してる?
INTEXTを最後まで読んじゃって「しおり」が最後にあるから、INCSVの2行目からの処理では
INTEXTを先頭から読めないじゃん?ってことね。
そのスクリプトの場合なら「しおり」であるファイルポインタを移動すりゃ思ったように動く。
頑張れ。
002821
2006/11/01(水) 04:44:02perlを始めて10時間。なかなか難しいですねぇ
もう少し、がんばってみます!!
0029デフォルトの名無しさん
2006/11/01(水) 04:48:06$outfile に ($TXfile の行数 * $CSfile の行数) 分のデータが書き込まれそうなんだが、
これはわかってやってるのかね?
って 10時間かよwww
003021
2006/11/01(水) 04:55:05ただ、検索置換したいだけなのに・・・・・
003120
2006/11/01(水) 05:19:11こういう感じにしてみた。$rateに何パーセントの確立で選ぶ値が入ります。例えば10とか20とか。
でもこれだと絶対にX%の確立で一方が選ばれないんだよね。
誤差が2−4%ぐらいでる。
何か言い方法ありませんか?
sub erabu{
my $rate = shift;
my $divider = $rate/10;
my $seed = 10/$divider;
my $randomInt = int(rand($seed));
if ( $randomInt == 0 )
{
return 0;
}
else
{
return 1;
}
}
0032デフォルトの名無しさん
2006/11/01(水) 05:50:410033デフォルトの名無しさん
2006/11/01(水) 06:31:46print文などを使って、変数の値を確認することを勧める
003421
2006/11/01(水) 06:54:580035デフォルトの名無しさん
2006/11/01(水) 07:33:46それは呪いだよ。
0036デフォルトの名無しさん
2006/11/01(水) 08:20:32$erabareta = 1 > rand 10;
・・・・しね
003721
2006/11/01(水) 08:50:01もうちょっと勉強してみる。
003820
2006/11/01(水) 09:15:34これ動かないんですが。
0039デフォルトの名無しさん
2006/11/01(水) 10:07:27アドレスとソースの取得はどのようにやればいいのでしょうか?
0040キューチャン
2006/11/01(水) 10:37:07手にいれるか知っている人いませんか? 教えてください
最新のものしかみつかりません
0041デフォルトの名無しさん
2006/11/01(水) 12:05:45質問スレなんだから問題ないと思うが。
0042デフォルトの名無しさん
2006/11/01(水) 12:13:25>>1
まぁいいじゃね?とは思うが。
0043デフォルトの名無しさん
2006/11/01(水) 12:20:190044デフォルトの名無しさん
2006/11/01(水) 14:15:17誰か解答教えて下さい。
ttp://www.ipc.hokusei.ac.jp/~z00104/semi/kadai4.html
0045デフォルトの名無しさん
2006/11/01(水) 14:35:450046デフォルトの名無しさん
2006/11/01(水) 15:03:01なんていうの?
0047デフォルトの名無しさん
2006/11/01(水) 17:54:320048デフォルトの名無しさん
2006/11/01(水) 17:56:03北星学園か。俺が昔かかわったことのある学校だなあ。
で、その5ってその手前で作ったのを変更して作れってことだよな?
変更する前のプログラムは作ったのか?
0049デフォルトの名無しさん
2006/11/01(水) 18:12:42これでよろしいでしょうか?
open(IN,"LIST.txt");
while( <IN> ) {
print $_ ; }
close (IN);
0050デフォルトの名無しさん
2006/11/01(水) 18:25:26追加モジュールをインスコしないとだめなんすね。回答ありがとうございました。
このくらい標準で入れといてほしいけどここで言ってもしょうがないか...
0051デフォルトの名無しさん
2006/11/01(水) 18:45:59それが4の答え? とするとそこからして間違いだと思うが。
まず4についてはね、ファイル開くのをいちいち自分で書く必要はなくて、
<>を使うと簡単。
@a = <>;
これだけで引数で指定したファイルまたはファイルを指定しなければ
標準入力からの入力が全部1行づつ @a に入る。文字列の数(行数)は
@a の数だ。これは @a を scalar として扱うだけでいい。これで
行数が出る。
print scalar(@a) . "\n";
で、@a の内容を全部表示するには
print @a;
でできる。
5はもう少し自分で考えろ。
0052デフォルトの名無しさん
2006/11/01(水) 22:16:51日本人だけが使ってるわけじゃないからね。
そもそもEncode関連はサイズ大きいから、必要としていない言語圏の方々からは嫌われてるとか聞いたこともあるし。
それにEncodeを使えば簡単にEncode::EUCJPMSみたいなのが作れるんだから、他言語よりはマシな気がする。
0053デフォルトの名無しさん
2006/11/01(水) 23:37:58行はいいのだが、列としてのあつかおうとすると
非常にめんどう(表計算ファイルとかのとき致命的)
たとえば2次元配列のリファレンス
$ref = ([ ],[ ], [ ])
があるとするとこれのそれぞれの
要素の第一成分を表示する
簡単な方法はないでしょうか?
print @{$・・@$ref->[0]};
といったかんじでできない?
005453
2006/11/01(水) 23:44:18簡単な方法は
foreach (@$ref){
print $$_[0];
}
ぐらいでもこれでもforeachとかかませて色々操作する必要がある
特に列間の計算とかすることになるとこれでは非常に
面倒
なにか一単語で簡潔にあらわせる方法があったはずなんだが・・・
おもいだせない
0055デフォルトの名無しさん
2006/11/02(木) 00:29:55005653
2006/11/02(木) 00:34:37ただ
@$\のくみあわせで
print @{$・・@$ref->[0]};
といったぐあいに(@{@$ref->[0]} みたいなかんじ)
で表現できたはずなんだ
どうしてもできない
おしえてほしい
0057デフォルトの名無しさん
2006/11/02(木) 02:20:21他人事ながら親切回答に感激
0058デフォルトの名無しさん
2006/11/02(木) 08:29:24perldoc perllol しても情報はないなぁ
> @part = @{ $AoA[4] } [ 7..12 ];
は単なる slice だし。
そういう方法があれば知りたいもんだ。
005921
2006/11/02(木) 08:49:43$CSfile="CSfile.csv";
$TXfile="TXfile.txt";
$outfile="outfile.txt";
open (INTEXT, $TXfile) or die "$!";
open (INCSV, $CSfile) or die "$!";
open (OUT, "> outfile.txt") or die "$!";
@lines = <INTEXT>;
$line_amount = @lines + 1; #行数計算
while (<INCSV>) {
chomp ($_);# 改行コードの除去
@data = split(/,/, $_);# 各行をカンマ区切りで分割
for($i=0;$i<$line_amount;$i++){
$lines[$i] =~ s/$data[0]/$data[1]/g;
}
}
print OUT @lines;
close(INTEXT);
close (INCSV);
close (OUT);
なんとなくできましたが、
速度が遅すぎる点と、結果が文字化けしている点がいかんともしがたい。
CSfile.csv=4万行以上・TXfile.txt=2万行程度(検索・置換は全て日本語です)
改善策をご指導ください。
0060デフォルトの名無しさん
2006/11/02(木) 09:16:50置換対象のファイルを@linesに行ごとに入れてループでまわすよりは
全体を一つの変数$linesにいれてまとめて置換した方がたぶん速い。
$lines = do { local $/; <INTEXT> };
文字化けの原因はここに書いてある情報だけではないともいえないが
たぶんEUCかSJISそのままでやってるせいじゃないかと思うので内部は
unicodeにしたほうがいいだろう。全部一緒ならopenプラグマで
use open ':encoding(sjis)';
のようにすればまとめて指定できるはず。
0061デフォルトの名無しさん
2006/11/02(木) 10:48:08どうもありがとう!やってみます!
006221
2006/11/02(木) 12:22:58文字化けは、解消されました。
速度については、速くはなったと思いますが、それでも遅い感じがします。
perlの限界なのかな・・・・
いろいろありがとうございました!
006321
2006/11/02(木) 12:59:25次はC言語でやってみたいと思います。
C言語も全くしたことないけど・・・・
速いのかな・・・・
0064デフォルトの名無しさん
2006/11/02(木) 13:22:15問題なのは行数よりサイズだと思うんだが・・・。
ってかそんな遅くなるとかどんなファイル扱ってんだよ('A`)
0065デフォルトの名無しさん
2006/11/02(木) 13:37:552万行の文字列を4万回置換だからそれなりに時間はかかるだろうな。
4万回s///するのと置換対象の文字列を全部 | でならべて
s/(文字列1|文字列2|...)/$h{$1}/g のようにするのとはどちらが
速いだろうか
あるいは発想を変えて、対応表を適当な有限状態オートマトンに
変換しといて置換対象の文字列を頭から食わすみたいな
アルゴリズムにするのもおもしろいかもしれない。
たとえば ab → d, ac → e
状態0:
aなら状態1へ
bなら状態2へ
それ以外はその文字を出力して状態0へ
状態1:
bならdを出力して状態0へ
cならeを出力して状態0へ
それ以外はaとその文字を出力して状態0へ
みたいな。
006621
2006/11/02(木) 14:07:01(´ヘ`;)
0067デフォルトの名無しさん
2006/11/02(木) 14:29:13自分でコントロールできるから試してみる
価値はあるな>63
OSコールが気に入らなきゃ、その部分を自分で
組み立てたっていいし
0068デフォルトの名無しさん
2006/11/02(木) 14:29:24同じ出だし辞書は全部飛ばし、別の出だし単語へ。
006968
2006/11/02(木) 14:32:440070デフォルトの名無しさん
2006/11/02(木) 15:08:23> s/(文字列1|文字列2|...)/$h{$1}/g のようにするのとはどちらが
> 速いだろうか
/(文字列1|文字列2|...)/ より /文字列1/ or /文字列2/ or ... って分けた方が早いらしいよ。
・・・って、どれかひとつにマッチしたら他にマッチしない前提なのかな
007121
2006/11/02(木) 15:21:500072デフォルトの名無しさん
2006/11/02(木) 19:45:27これで $now_size が $size より小さければ $max_buf は0になります。
$now_size が $size より大きければ $max_buf には $size より足りない数になります。
どうなるかは解ったのですが、そうしてこうなるのかが解りません。
どういう風に解釈したら良いのでしょう。
<例>
$size = 12
$now_size = 10
$max_buf = 0
<例>
$size = 10
$now_size = 12
$max_buf = -2
0073デフォルトの名無しさん
2006/11/02(木) 20:06:12> $max_buf = $size - $now_size if $size - $now_size < $max_buf;
>
> これで $now_size が $size より小さければ $max_buf は0になります。
ちがう。if文が偽を返しただけだ。
0074デフォルトの名無しさん
2006/11/02(木) 20:14:27ううん。
すみません、良くわかんないです。
ただ、理解する手がかりになりましたので勉強します。
回答をありがとうございました。
0075デフォルトの名無しさん
2006/11/03(金) 20:42:55毎回正規表現をコンパイルしにいってるから遅いとかはないかな?
このサンプルを元に作ってみたら?
日本語がほしけりゃPerl Cookbookを買いましょう。
ttp://www.unix.org.ua/orelly/perl/cookbook/ch01_18.htm
0076デフォルトの名無しさん
2006/11/04(土) 13:25:02> $max_buf = $size - $now_size if $size - $now_size < $max_buf;
これは
if( $size - $now_size < $max_buf ){
$max_buf = $size - $now_size;
}
と同じです。っていうのは分かってるのかな・・・?
0077デフォルトの名無しさん
2006/11/05(日) 00:10:100078デフォルトの名無しさん
2006/11/05(日) 00:22:57@_の要素数を見ればいくつパラメタが与えられたかわかるので
適当に分岐なりなんなりすればよい。
0079デフォルトの名無しさん
2006/11/05(日) 04:24:45途中で改行したいのですが、実際に条件式の途中で改行するとエラーになってしまいます。
解決策を教えてください。
条件式
$hoge =~ /VALUE="(.*?)"(?:.|[^.])*?VALUE="(.*?)".*?VALUE="(.*?)".*?VALUE="(.*?)".*?VALUE="(.*?)".*?VALUE="(.*?)"(?:.|[^.])*>(\d+)(?:\(hugahuga\)|\(hogehoge\))/;
0080デフォルトの名無しさん
2006/11/05(日) 05:02:16"x" をつける
0081デフォルトの名無しさん
2006/11/05(日) 05:15:00できました。
これ便利ですね。
どうもありがとうございました。
0082デフォルトの名無しさん
2006/11/05(日) 13:16:32$hoge =~ /プーさん/;
を実行すると
Unmatched [ in regex; marked by <-- HERE in m/プー <-- HERE さん/ at C:\hoge\test.pl
とエラーになります。
パターンの先頭がパー、ピー、プー、ペー、ポーにだとエラーになるようです。
$hoge =~ /\プ\ー/;
エスケープしてもうまくいきません。
どうしてでしょうか?
0083デフォルトの名無しさん
2006/11/05(日) 13:29:26長音(ー)の2バイト目が 0x5B で、'[' (0x5B) として解釈されてしまうからです。
\Q と \E で囲むと、その間の文字列は正規表現として解釈されなくなります。
/\Qプーさん\E/
ではどうでしょうか?
0084デフォルトの名無しさん
2006/11/05(日) 13:31:59全部EUCで書いちゃうのも手かもね。
0085デフォルトの名無しさん
2006/11/05(日) 17:56:01ファイルをアップすると[upxxxx.xxx]という名前に強制的になりますが、
これを[MAQxxxxx.MP4]という様にしたいです。
(xxxxxの部分は、アップされた順に00001,00002,00003という感じに)
どうすれば良いのでしょうか?
また、MP4ファイルをアップしそれを落とそうとしてファイル名のところを
クリックすると、QuickTimeによって再生され、保存することが出来ません。
これを再生されること無く、ファイル名をクリックしただけでDLが始まるようにするのは
どうすれば良いのでしょうか?
分かりにくい文章かもしれませんが、教えてください。お願いします。
0086デフォルトの名無しさん
2006/11/05(日) 18:59:54前半はすれ違い
後半はいた違い
0087デフォルトの名無しさん
2006/11/05(日) 19:12:36え・・・
uploder.cgiの中身を書き換えるんじゃないんですか?
そうだと思ってPerlのスレにに書いたのですが・・・。
もしかして、ここじゃなくてCGIの質問スレに書くべきでしたでしょうか。
0088デフォルトの名無しさん
2006/11/05(日) 19:55:09>>1
0089デフォルトの名無しさん
2006/11/06(月) 00:06:180090デフォルトの名無しさん
2006/11/06(月) 00:55:100091デフォルトの名無しさん
2006/11/06(月) 01:49:21009282
2006/11/06(月) 02:11:23\Q, \Eを使って解決しました。
レスありがとうございました。
0093デフォルトの名無しさん
2006/11/06(月) 04:18:12今は下のようにめんどくさいことをしています。何かうまい方法はありませんか?
print "ほげ";
print LOG "ほげ";
print "ふがふが";
print LOG "ふがふが";
0094デフォルトの名無しさん
2006/11/06(月) 04:33:50perl のプログラムでは標準出力に出すだけ。
tee を使ってリダイレクトするか、
単にリダイレクトしてそのファイルを別端末で tail -f する。
0095デフォルトの名無しさん
2006/11/06(月) 04:54:25二穴用のさぶる〜ちん作りゃいいやん
0096デフォルトの名無しさん
2006/11/06(月) 05:29:48open(STDOUT,"|tee log");
0097デフォルトの名無しさん
2006/11/06(月) 06:20:270098デフォルトの名無しさん
2006/11/07(火) 04:16:20$data { 'Class_A' } [ 0 ] { 'FirstName' } = '太郎' ;
みたいな配列とハッシュを組み合わせた変数を用意しようと思います。
リファレンスとか多次元とかサブルーチンとかごちゃごちゃで混乱してます。
【1】変数の値を生成し、代入したい
my %data;
#(略。ループとかDBからの取得とか)
my %hash;
$hash{'FirstName'} = '太郎';
$hash{'FamilyName'} = '田中';
push ( @data{'Class_A'} , \%hash );
#(略。ループ終了とか)
と書いてみたのですが、型が違ぇよボケ(意訳)と言われてしまいました。
(実際には、Class_Aや田中、太郎の部分にはデータベースから取得した値が入る)
仕方ないので、
my @tmp = @data{'Class_A'};
と、あらかじめコピーしておいてから、最後に
push(@tmp,\%hash);
@data{'Class_A'} = \@tmp;
一時ファイルの中身を戻すとかやってる始末です。
もうちょっとスマートな方法はありませんでしょうか。
0099デフォルトの名無しさん
2006/11/07(火) 04:17:50A組→B組→B組→B組→C組→A組→C組 とかもありえます。
各クラスの生徒数は不明です。
【2】特定のクラスに所属する生徒の情報を取り出したい。
なお、取り出す順番(出席番号)については言及しない。もちろんしてもいい。
foreach my $key (keys @data{'Class_A'} )
というループを作ってみたのですが、最終的な値(田中とか太郎とか)を取得する方法が分かりません。
$data{'Class_A'}[$key]{'FirstName'}
$key{'FirstName'}
など幾つか試してみましたが、全く取得できる気配はありませんでした。
(どちらも「太郎」などの文字列の取得を期待しています)
0100デフォルトの名無しさん
2006/11/07(火) 04:36:35push ( @data{'Class_A'} , ¥%hash );
のところを
push ( @{$data{'Class_A'} }, ¥%hash );
でいいんじゃないか
0101デフォルトの名無しさん
2006/11/07(火) 04:44:23my %data;
#(略。ループとかDBからの取得とか)
my %hash;
$hash{'FirstName'} = '太郎';
$hash{'FamilyName'} = '田中';
push (@{$data{'Class_A'}},¥%hash);
foreach my $class ('Class_A', 'Class_B', 'Class_C') {
foreach my $student (@{$data{$class}}) {
print $student->{'FirstName'} . $student->{'FamilyName'} . "¥n";
}
}
■ このスレッドは過去ログ倉庫に格納されています