トップページ⇒php
981コメント337KB

くだすれPerl(超初心者用)3

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2009/03/31(火) 22:20:27ID:???
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Perl使いが優しくコメントを返しますが、
お礼はPerlの布教と初心者の救済をお願いします。

前スレ
くだすれPerl(超初心者用)2
http://pc11.2ch.net/test/read.cgi/php/1204488452/

関連スレ
Perlについての質問箱 39箱目
http://pc12.2ch.net/test/read.cgi/tech/1234181856/
Perlコーディング初心者質問スレ Part 59
http://pc11.2ch.net/test/read.cgi/php/1234752149/
【Perl上級者コーナーPart01】
http://pc11.2ch.net/test/read.cgi/php/1024741312/
0153nobodyさん2009/06/18(木) 22:59:24ID:???
>>152
Windowsの場合、上手く動かないんです。

use POSIX qw(tzset tzname strftime);


$ENV{TZ} = 'GMT+0';
tzset;


my ($std, $dst) = tzname;

print "$std $dst\n";

print strftime('%Y-%m-%d %H:%M:%S', localtime), "\n";


-- Linux(Debian)
GMT GMT
2009-06-18 13:48:27

-- WindowsXP
東京 (標準時) 東京 (標準時)
2009-06-18 22:46:20

# やっぱりgmtimeに置き換え?
0154nobodyさん2009/06/18(木) 23:10:33ID:???
>>153
それってwindowsではgmtが取得できて無いってだけで、localtimeの動作としては合ってるんじゃないのか?
0155nobodyさん2009/06/19(金) 01:05:31ID:???
>>154
Cでも書いてみたのですが、それはLinuxと同じ動作をしました。
結局、下のようなテストケースでUnix:OK, WIndows:NGなのでどうしましょうということでした。

use Test::More qw(no_plan);

use POSIX qw(tzset);


$ENV{TZ} = 'GMT+0GMT';

tzset;



my $now = localtime(1245338340);

ok($now eq 'Thu Jun 18 16:19:00 2009', $now . ' localtime test');
0156nobodyさん2009/06/19(金) 14:25:45ID:ceoCS57H
http://niconama.ddo.jp/

ダウンロード数をカウントするために、PHPアップローダーからアップロードしたファイルを収納しているディレクトリを
CGIのダウンロードカウンターのほうで読み込んで、アップローダーからファイルにアクセス→リダイレクトして
ダウンロードカウンタのURLに移動してファイルを表示、という事をしているのですが、
ダウンロードカウンタの設定で、画像にアクセスしてもブラウザで開かず、ファイルのダウンロードが開いてしまいます。
何時間もググって調べたのですが、プログラムを全くやった事がないので、結局解決しませんでした。
どうすれば、画像をブラウザで開くように出来るんでしょうか。

http://localhost/uploda/src/nico61.txt
これが使ってるカウンタのスクリプトです。

詳しい方、どこを弄ればいいのか教えて頂けないでしょうか。
宜しくお願いします。
0157nobodyさん2009/06/19(金) 14:30:52ID:???
localhost のロダにあるものを見てくれと言われましても
0158nobodyさん2009/06/19(金) 14:39:19ID:ceoCS57H
http://niconama.ddo.jp/src/nico61.txt
ごめんなさい間違えました。
0159nobodyさん2009/06/19(金) 14:42:27ID:ceoCS57H
http://niconama.ddo.jp/uploda/scr/nico61.txt
度々すいませんこれです。
0160nobodyさん2009/06/19(金) 14:55:44ID:ceoCS57H
http://niconama.ddo.jp/uploda/src/nico61.txt
これです、ほんとすいません。
0161nobodyさん2009/06/19(金) 15:09:27ID:???
あまり関係ないが、hostsファイルに
127.0.0.1 niconama.ddo.jp
と書いておけばいいぞ。
0162nobodyさん2009/06/19(金) 22:11:17ID:???
>>156
スーレーちーがーいー

【 スクリプト改造依頼スレ】(丸投げ) part7再々
http://pc11.2ch.net/test/read.cgi/php/1222645553/
0163nobodyさん2009/06/19(金) 22:19:49ID:???
>>156
それよりもnwhoisの再うp消せよ
0164nobodyさん2009/06/20(土) 11:40:20ID:???
文字の比較についての質問です。
以下のように書くと、「真」が表示されます。

if ("真" eq "真" ){
print "真";
}

しかし、以下のように書くと、「真」は表示されません。

if ("真" =~ /真/ ){
print "真";
}

if ("真" =~ "真" ){
print "真";
}

if ("真" =~ /"真"/ ){
print "真";
}

=~ を使用する場合において、「真」が表示される
ようにするにはどうしたらよろしいのでしょうか。

基本的なことですが、どうしても分からないので
質問させていただきました。よろしくお願い致します。
0165nobodyさん2009/06/20(土) 12:06:50ID:???
/\Q真\E/
CP932でコードを書くのをやめるという選択肢もあります。
01661642009/06/20(土) 13:33:31ID:???
>>165
検索サイトでいろいろなキーワードで検索していたのですが、
なかなか答えとなるものが見つかりませんでした。
回答は非常に助かりました。ありがとうございます。
0167nobodyさん2009/06/20(土) 15:58:40ID:???
>>162
すいません移動します。
0168nobodyさん2009/06/22(月) 03:35:03ID:mckf9gfO
質問させていただきます。

CGIの勉強をしていてCGIの製作を行っているのですが、レスポンスが遅い気がします。
abでベンチを書けてみたのですが、10リクエストの処理に5秒もかかっています。(そんなに重いCGIではないです。

自分のコードの書き方が悪いのか、それともマシンが遅いのか調べたいのですが、abをかけるいいサンプルのようなものは無いでしょうか。
他のマシンでどれくらいのスピードで動いているかなどのサンプルがあるものだとうれしいです。
0169nobodyさん2009/06/22(月) 04:00:45ID:???
>>168
Devel::Profiler
Devel::NYTProf
これで性能分析ができるらしい
ボトルネックあるならこれで分かるだろー
0170nobodyさん2009/06/28(日) 17:18:33ID:I7LpaOR5
日本語の単語を入力させるWebアプリ作っているんだが
Jcode.pmに文字コードを自動認識させようとするとたまに誤変換するんだが
(たとえば「えー」をucs2に変換させようとすると「?????」に化ける)
その辺の認識精度を上げるにはどうすればいいのかな?

WebページはUTF-8で構成しているけど、フォーム入力から飛んでくる
文字コードはブラウザが勝手に決めてしまう、って認識で合ってるよね?
0171nobodyさん2009/06/28(日) 18:06:04ID:???
でんでんつがう
0172nobodyさん2009/06/28(日) 19:37:43ID:???
主要ブラウザの実装では、ページの文字エンコード指定もしくは自動判別したそれに従う。
ページのそれと変えたい場合もしくは、より厳密にしたい場合のために、HTML4ではform属性にaccept-charsetが追加された。ただしIE6は未対応。

このレスはたぶん大体あってる。
0173nobodyさん2009/06/28(日) 22:09:18ID:???
>>170
ブラウザの仕様はどうであれ、どんなコードでも対応できるように作っておくのはとても大切。
hiddenで文字コード判定用の文字列をpostしておくと良い。
0174nobodyさん2009/06/29(月) 01:22:45ID:???
でも無意味な場合もある
0175nobodyさん2009/07/05(日) 01:58:48ID:???
これを実行すると#2の出力が文字化けします。
恐らく GET のパラメータの文字コードが utf-8 でないためだと考えています。
どのようにすれば解決できるでしょうか。

#!/usr/bin/perl
use CGI;

my $cgi = CGI->new();
my $str = $cgi->param("str");

print $cgi->header( -charset => 'UTF-8' );

#1
print $str;
#2
sub {map {print $_, "\n"} split(//,shift) }->($str);
0176nobodyさん2009/07/05(日) 02:10:22ID:???
入力元のページは utf8 か?
そうじゃぁなければ use Encode しれ
0177nobodyさん2009/07/05(日) 09:58:44ID:???
>>176
ありがとう。できた。
0178nobodyさん2009/07/26(日) 00:42:20ID:J3wl39Kv
漏れら極悪非道のageブラザーズ!
今日もネタもないのにageてやるからな!
 ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ∧_∧   ∧_∧    age
 (・∀・∩)(∩・∀・)    age
 (つ  丿 (   ⊂) age
  ( ヽノ   ヽ/  )   age
  し(_)   (_)J
0179nobodyさん2009/07/29(水) 22:19:43ID:???
すみません、質問させてください。

CGI(Perl)を使って外部のサイトからHTMLソースを取り込むにはどうしたら良いでしょう?
外部サイトのデータから統計を取って、データとして出力するようなCGIが書高と思ってます。
0180nobodyさん2009/07/29(水) 22:20:40ID:???
連レスすみません
>>179
「CGIが書高」→「CGIを書こう」です。
0181nobodyさん2009/07/29(水) 22:25:45ID:???
LWPでググルといいよ
0182nobodyさん2009/07/29(水) 22:46:06ID:???
> LWPでググルといいよ

知らないなら、「わかりません」って言えよ
0183nobodyさん2009/07/29(水) 22:54:54ID:???
それでは>>182先生、よろしくお願いします。
0184nobodyさん2009/07/29(水) 23:26:28ID:???
>>182
よっ! 待ってました!
01851792009/07/30(木) 01:23:24ID:???
LMPでググったところ、HTTP::Liteというのを見つけたので、それを使用して解決しました。
ありがとうございます。
0186nobodyさん2009/08/04(火) 17:31:46ID:opJYW1lj
わからないのでお願いします。
文字化けする文字をこのように変えたいのですが変換されません。
どのように書けばいいのでしょうか。

$a =~ s/��/高/g;

よろしくお願いします。
0187nobodyさん2009/08/04(火) 18:22:15ID:???
まず置換対象文字列の文字コードと書いてるコードの文字コードを把握しろ
0188nobodyさん2009/08/04(火) 18:46:13ID:Udgymmfy
>>186
��が文字化けするので高に変えたいってこと?
0189nobodyさん2009/08/05(水) 08:42:09ID:57ai1vyR
test
0190nobodyさん2009/08/05(水) 10:00:37ID:2mkcb2/U
>>187
ありがとうございます。

>>188
はい、そのようにしたいと考えております。

187さんのおっしゃる通りに、書いてるコードを確認したところEUCでしたので
sjisに変えてみたところ、うまくできました!
ここ数日、悩んでいたのですっきりしました。
187さん、188さん、ありがとうございました。
0191nobodyさん2009/08/05(水) 20:48:29ID:???
文字列の抽出についての質問です。
任意の文字で囲まれた
文字列をすべて抽出する方法がわかりません。

たとえば、abcabcabcといった文字列に対し
aとcで囲まれたすべての文字列を取得するには
どうすればいいのでしょうか?

この例だと
abc
abcabc
abcabcabc
abcabc
abc
が該当します。これらをすべて抽出したいのですが。
0192nobodyさん2009/08/05(水) 21:27:00ID:???
my $str = 'abcabcabc';
while($str =~ m/(a)/g){
my $pos = pos($str);
my $result = $1;
while($str =~ m/([^c]*c)/g){
$result .= $1;
print "$result\n";
}
pos($str) = $pos;
}
01931912009/08/06(木) 09:27:03ID:???
返事が遅くなってすみません。
>>192さん ありがとうございました。
思っていたように動作しました。

続けての質問で申し訳ないのですが
アルファベットで構成されるランダムな文字列
CFGTARFEQZCAZVHNNNGZYAKLOPYL..(みたいな感じです)
から例えば、Aから始まり X,Y,Zを中に含まず XまたはYまたはZで終わる
文字列をすべて抽出するには
どのようにすればよいのでしょうか?

実際には単一のアルファベットの連続ではなく
ONETWOTHREEFOURFIVE..のように
単語が適当に連続しているものと想定して使用できる記述を
(ONEで始まりSIXを含まずTENで終わり のように)
提案していただけると助かります。

よろしくお願いします。
01941912009/08/06(木) 09:38:23ID:???
すみません、上の質問に対する追加です。
単語はONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TENが想定される
のように、あらかじめ分かっていて指定することができます。
0195nobodyさん2009/08/06(木) 15:43:26ID:0zj+bmfk
てすと
0196nobodyさん2009/08/06(木) 23:46:37ID:???
んー、文字列探索のパッケージがありそうな気がするけど。てけとうに作って見た。

sub start {
my ($item, $sub) = @_;

return sub{
my ($str) = @_;
my $start = 0;
while((my $new = index($str, $item, $start)) >= 0){
$start = $new+length($item);
$sub->(\$str, $start, length($str), $item);
}
};
}

sub without {
my ($item, $sub) = @_;

return sub{
my ($str, $start, $end, $result) = @_;
my $new = index(${$str}, $item, $start);
$end = $new if ($new >= 0 && $new < $end);
$sub->($str, $start, $end, $result);
};
}
0197nobodyさん2009/08/06(木) 23:47:37ID:???
sub end {
my ($item) = @_;

return sub{
my ($str, $start, $end, $result) = @_;
while(1){
my $new = index(${$str}, $item, $start);
($new >= 0 && $new < $end) or last;
$result .= substr(${$str}, $start, $new+length($item)-$start);
$start = $new+length($item);
print "$result\n";
}
};
}

my $str = join('', map{
qw(ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE TEN)[int(rand(10))]
} (1..100));

print "$str\n\n";

start('ONE', without('SIX', end('TEN')))->($str);
01981912009/08/07(金) 00:23:46ID:???
>>196,197さん ありがとうございます。
動作検証し、勉強させていただきます。

複数のファイルから質問のようなことをしたくて
テキストエディタでの単純な正規表現での処理だと面倒なので
やったこともないプログラミングのようなことをを試みたのですが
単純なマッチングでは、オーバラップしているところが
検索から漏れて困ってました。
01991962009/08/07(金) 01:07:13ID:???
実際にやってることは、くっだらない事だから、あまり期待しないでね。

終わりの条件を複数にするのを忘れてたけど、
$subを配列にしてループさせると、探索条件を複数にすることもできると思う。
0200nobodyさん2009/08/07(金) 01:34:42ID:???
>>196
是非わが社に(笑)

掲示板見てると出来る人そこそこいるのにperl経験者募集かけても全然こないのは
年寄りが多いのか…若くてもそこそこの地位になってるのか…

正規表現あんまり自信ないですくらいなら許せるが
リファレンスもOOPもわかりませんって人多くて最近疲れ気味だ(泣)
0201nobodyさん2009/08/07(金) 05:53:45ID:???
>>200
待遇がショボいか求人出すところ間違えてる。
0202nobodyさん2009/08/07(金) 10:28:18ID:wZBhH276
PerlよりPHP全盛だしねぇ
0203nobodyさん2009/08/08(土) 08:08:10ID:nShQ5pki
文字の途中に他の変数の値入れるにはどうすればいいの?
$b = "str$astr";だと最初の「str」で途切れるし
$b = "str$a str";にすると空白はいっちゃうし
0204nobodyさん2009/08/08(土) 08:38:19ID:???
"str${a}str"
"str$a\str"
0205nobodyさん2009/08/08(土) 09:58:31ID:???
ありがとう!
0206nobodyさん2009/08/10(月) 13:15:14ID:LPa3QqaE
てすと
0207nobodyさん2009/08/13(木) 09:14:17ID:NeVAVZeH
cgiで受信したHTTPヘッダが丸ごと入ってる環境変数みたいなの無いの?
受け取ったデータまんま返したいんです
環境変数を使い分けるの面倒だし
0208nobodyさん2009/08/13(木) 18:35:28ID:???
>>207
あるけど、そのまま返すとXSS脆弱性持つよ。
0209nobodyさん2009/08/14(金) 04:46:30ID:???
>>203は俺だったら"str".$a."str"にするなぁ
なんとなく変数は文字列定数とは独立させたい
0210nobodyさん2009/08/14(金) 16:39:29ID:???
if文の中身はどう書けばいいのでしょうか?

$str = "euc or shift-jis or utf8";
if ( $strに"euc"と"shift-jis"という両方の文字を含んでいたら ) {
・・・
{
0211nobodyさん2009/08/14(金) 17:03:04ID:???
Encode::Guess の結果か
優先順じゃないから気をつけて


で、正規表現つかってね
0212nobodyさん2009/08/14(金) 18:29:29ID:???
>>210
実直に書けば
$str =~ /(^.*euc.*shift-jis.*$)|(^.*shift-jis.*euc.*$)/
かな

後々にも条件文が続くなら
my %hash = map{ $_ => 1} split ' or ', $str;
if($hash{'euc'} and $hash{'shift-jis'}){
}
elsif($hash{'utf8'}){
}
...

とかどうよ
0213nobodyさん2009/08/15(土) 08:03:40ID:???
>>211-212
はい、Encode::Guessの結果後の処理です。
具体的なコードありがとうございます。
0214nobodyさん2009/08/15(土) 09:36:01ID:njfakeIM
>>208
それでもいいので教えてください
0215nobodyさん2009/08/15(土) 16:36:11ID:???
>>207
%ENV
0216nobodyさん2009/08/18(火) 18:06:40ID:RO5+3AJ6
CUIで実行する時print使うときに改行つけないと画面に表示されないけど
あれなんとか出来ないの?
0217nobodyさん2009/08/18(火) 18:29:11ID:???
flush
0218nobodyさん2009/08/18(火) 18:30:34ID:???
$|=1;
0219nobodyさん2009/08/18(火) 18:53:46ID:RO5+3AJ6
ありがとう
0220nobodyさん2009/08/19(水) 23:25:05ID:???
$|とかググれないし、いい加減なんとかするべきだと思うんだ
0221nobodyさん2009/08/20(木) 02:33:32ID:???
$|でググるやつはおらんだろ・・・
0222nobodyさん2009/08/21(金) 21:25:25ID:OnG1WZEr
$s = 0;
$s =~ /(.)/;
for($i=4; $i>0; $i--) {
print "$1\n";
$i =~ /(.)/;
}
↑これ実行すると「0321」となるはずなのに「0000」になるんだけど何で?
正規表現処理した後にプリント使うと「4321」になるけど、どうしてもこのまま使いたいです
0223nobodyさん2009/08/21(金) 21:34:13ID:???
for($i=4; $i>0; $i--) {
print "$i\n";
$i =~ /(.)/;
}
0224nobodyさん2009/08/21(金) 21:42:18ID:OnG1WZEr
hspとvbがはやいんだろう
0225nobodyさん2009/08/21(金) 21:42:35ID:???
>>222
いや、どう見ても「0321」なんてならんぞ。>>223でも「4321」だし。
何見て書いたそれ?
0226nobodyさん2009/08/21(金) 21:44:13ID:???
試してないけど0432じゃ?
0227nobodyさん2009/08/21(金) 21:49:31ID:???
>>222
多分ループごとに $1 が変数スコープ外れてる

my $num = 0;
my $put;
$num =~ /(.)/;
$put = $1;
for(my $cnt = 4; $cnt > 0; $cnt--){
print "$put\n";
$cnt =~ /(.)/;
$put = $1;
}

これでいけるけど、もっといい書き方がきっとあるはず
具体的に何したいのかを書けばもっといいアドバイスがもらえると思うよう
あと一文字の変数を使うのと use strict しないのはよしといたほうがいいよ
落とし穴ハマってうっきーってなるから


と思ったけど実行結果 0321 なのな・・・ちょっと意味分からんわ
0228nobodyさん2009/08/21(金) 22:33:56ID:???
my $i = 0;
do{
$i =~ /(.)/;
print "$1\n";
$i = ($i-1) % 4;
}while($i > 0);

結果は出るけど、質問の意図が読めないからどうなんだろ。
0229nobodyさん2009/08/21(金) 23:10:07ID:???
my $s = 0 =~ /(.)/ ;
for( my $i=4; $i>0; $i-- and print "$1\n" and $i =~ /(.)/ ) { }
0230nobodyさん2009/08/22(土) 01:20:43ID:???
いろんな書き方知りたいわけじゃなくて
$Nのスコープってどうなってんだ?
って質問なんじゃ?
0231nobodyさん2009/08/22(土) 05:10:44ID:???
#!/usr/local/bin/perl --

$a = "[123][456][789]";

while($a =~ /[(.*?)]/){
print $1"\n";
}

123、456,789と表示したいです
一回ずつづらしてマッチさせられないですか?
0232nobodyさん2009/08/22(土) 05:24:03ID:???
>>231
1回ずつじゃないけど

$str = "[123][456][789];
@contents = $str =~ /[(.*?)]/g;
print "$_\n" foreach @contents;
0233nobodyさん2009/08/22(土) 05:26:41ID:???
実験して3秒あせったw
正規表現もバグってるよ

$str = "[123][456][789]";
@contents = $str =~ /\[(.*?)\]/g;
print "$_\n" foreach @contents
0234nobodyさん2009/08/22(土) 07:32:50ID:???
>>231
my $s = "[123][456][789]";

while($s =~ /\G\[(.*?)\]/g){
print $1, "\n";
}
0235nobodyさん2009/08/22(土) 07:41:35ID:???
>>230
正規表現周りは奇妙だからなぁ。
たとえば、最後にマッチした正規表現を使う、空マッチを使うと期待通りに動く。
$1などの変数はマッチ直後に保存しとくのがベストだろうと思う。

my $s = 0;
$s =~ /(.)/;
for(my $i = 4; $i > 0; --$i){
print $1, "\n";
$i =~ //;
}
0236nobodyさん2009/08/22(土) 08:33:57ID:???
>>234
\Gは何の意味があるのですか?
0237nobodyさん2009/08/22(土) 09:07:20ID:???
>>236
m//gで、前回マッチした直後からマッチングを行う。
my $s = "[123]456][789]";
こんなときに、処理を止める。
0238nobodyさん2009/08/22(土) 09:40:50ID:???
>>237
>>234で\Gをはずしても同じ結果になるのですが、それでも意味があるのでしょうか?
0239nobodyさん2009/08/22(土) 09:48:08ID:???
>>238
意味が分からん。
別に気に入らなければ、付けなきゃいいじゃん。

>>238
じゃあさ、>>231のシェバング行の -- が無くても同じ結果になるけど、
-- に意味があると思う?
0240nobodyさん2009/08/22(土) 10:21:27ID:???
ループ内で宣言したものはその中でしか生きられない

正規表現で () 使った後に使える $n は、
正規表現使った時に my されると思った方が
いいかも知れません
0241nobodyさん2009/08/22(土) 10:40:35ID:???
しかしスコープの問題だとすると、>>222の結果って「0000」じゃなくて「」(null)になりそうな気もするがな。
$1の初期値が「0」ってことはないだろうし。
0242nobodyさん2009/08/22(土) 11:10:48ID:???
>>241
>>240の言葉を借りれば、グローバルなレキシカル変数$1(下の(1))と、forループ内で
$i =~ /(.)/;より下で有効なレキシカル変数$1の2つが混在していると。

$s = 0;
$s =~ /(.)/; #=> my $1 = "0" ・・・(1)
for($i=4; $i>0; $i--) {
print "$1\n"; "=> この時点では1つ上のスコープのグローバルな$1、すなわち(1)を表示
$i =~ /(.)/; #=> my $1 = $i ・・・(1)のグローバルなレキシカル変数$1は、一旦ここで見えなくなる
}
0243nobodyさん2009/08/22(土) 12:04:28ID:???
>>240
では、面白い例を。結果は0432。

my $s = 0;
$s =~ /(.)/;
foreach(reverse 1..4){
print $1, "\n";
/(.)/;
}
0244nobodyさん2009/08/23(日) 21:12:44ID:???
>>243
何故…
なんか理由があってこうなってんの?
0245nobodyさん2009/08/25(火) 18:13:21ID:???
会社で引き継いだスクリプトに下記の様な記載がありました。
別に現状では何も問題が無いんですが、何の意味があるか良くわかりません。

if 文で変数が未定義だったら何をしているんでしょうか?

$stlist{$kumi}{$bangou}= [] if ! exists $stlist{$kumi}{$bangou};
0246nobodyさん2009/08/25(火) 22:37:47ID:???
use strict;
use warnings;

my %stlist = ();
my $kumi = 1;
my $bangou = 2;

$stlist{$kumi}{$bangou} = 3;
$stlist{$kumi}{$bangou} = [] if ! exists $stlist{$kumi}{$bangou};
print $stlist{$kumi}{$bangou},"\n";

undef $stlist{$kumi}{$bangou};
$stlist{$kumi}{$bangou} = [] if ! exists $stlist{$kumi}{$bangou};
print $stlist{$kumi}{$bangou},"\n";

--

>perl test_perl.pl
3
Use of uninitialized value in print at test_perl.pl line 14.
0247nobodyさん2009/08/25(火) 22:54:19ID:???
まあ

$stlist{kumi}{bango} ||= [];

で同じことできるんだけどな
0248nobodyさん2009/08/26(水) 00:28:41ID:???
>>247
$stlist{$kumi}{$bangou} //= [];

じゃなくて?
0249nobodyさん2009/08/26(水) 09:57:20ID:???
245です。ありがとうございます。

意味はモヤッと解ってきたのですが「[]」 の使い方が解らないんです。
「()」では駄目なんですか?

0250nobodyさん2009/08/26(水) 18:52:28ID:mCRAV2Yd
Cのscanf関数みたいなのってないの・
0251nobodyさん2009/08/26(水) 21:01:17ID:???
>>249
() 配列
[] 配列のリファレンス

ここで
$hoge = ();
とすると、多分スカラーコンテキストで無名配列が評価されるので0が入る
$hoge = [];
だと配列のリファレンスが入るから、何も値が入ってない状態で
$hoge->[0]
とかやってもうまく動く

多分ね
0252nobodyさん2009/08/27(木) 02:29:49ID:???
便乗ですいません。

my $hoge = [1, 2, 3, 4, 5];
my $huga = [6, 7, 8, 9];

という風に二つの配列へのリファレンスがあったとして、
この二つの配列を合わせた配列へのリファレンスを新しく作るには

my $kei = [ @{$hoge}, @{$huga} ];

以外に方法はありますか?
いろいろ試してみたんですが上手くいかなくて…。
■ このスレッドは過去ログ倉庫に格納されています