- ベストアンサー
ハッシュリファレンスの無名変数
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
test({ baa => 1, boo => 2 }); でうまくいきませんか? [参考] http://www.rfs.jp/sb/perl/02/10.html の「無名ハッシュへのリファレンス」 #余談 testサブルーチンはこっちの環境だと 以下のようにしないと動かなかった。 sub test { my %hash = %{ (shift) }; print $hash{baa}; }
関連するQ&A
- ハッシュのリファレンスを用いた処理
ActivePerl 5.8 , WinXP SP2の環境です。 Perl スクリプトを用い、ファイルから複数のブロックからなる情報をよみとり、個別のハッシュを作り、それをリファレンスの配列としてまとめて後から参照するという操作をしたいのですが、詰まってしまいました。。 例として読み取るファイルは ---input.txt--------- >1 Jan 1 Feb 4 >2 Mar 9 Apr 3 >3 Oct 8 Nov 4 ------------------ ここから1,2,3の個別のハッシュ {Jan => 1 Feb => 4} {Mar=> 9 Apr =>3} {Oct =>8 Nov =>4} を作成し、それぞれのハッシュのリファレンスの配列をつくり、その後からすべてのハッシュの中身を個別に出力させたいと思いました。 次のようなスクリプトを作成したのですが思ったように作動しません。 use strict; open (IN, "input.txt") or die ("cant open file \n"); my $reff; my @array_of_reff; my %hash; my $count = 0; while(<IN>){ my $line = $_; ######ここでは各ブロックの頭の ">"を認識し、2個目以降であれば直前までで作ったハッシュのリファレンス($reff)を配列@array_of_reffに入れる。 if($line =~ /^>/){ if($count >0){ $reff = \%hash ; push (@array_of_reff, $reff); %hash = (); } $count++; } ########ここではアルファベットが入った行を認識して、ハッシュに追加しています if($line =~ /^[A-Za-z]/){ $line =~ /([A-Za-z]+)\s+/; my $month = $1; $line =~ /\s+(\d+)/; my $day= $1; $hash{$month} = $day; } ###ここはファイルの最後になったら直前まで作っていたハッシュののリファレンス($reff)を配列@array_of_reffに入れる。 if( eof ){ $reff = \%hash ; push (@array_of_reff, $reff); } } #####ハッシュのリファレンスの配列(@array_of_reff)からもとのハッシュを参照し、ハッシュごとに出力 foreach my $reff_of_hash (@array_of_reff){ print "output"; while( (my $key,my $value) = each %$reff_of_hash ){ print "\n" , $key, " : ", $value, ; } } このスクリプトを実行すると Nov 4 Oct 8 という3つめのハッシュのなかみが3回出力されてしまいます。自分では3つの別のハッシュをつくっているつもりでも、どうやら1種類しか作れていない、もしくはハッシュが上書きされているようなのですが、原因がわかりません。 この例だけ見るとハッシュのリファレンスを使う必要はないのですが、実際にはもうすこし大きいスクリプトで"ハッシュのリファレンスの配列を他のサブルーチンに渡す"ということを想定しており、これが解決できず先に進めない状態です。 アドバイス、解決法がわかったら教えていただけないでしょうか。
- ベストアンサー
- Perl
- ハッシュリファレンスの未定義
サブルーチン/ハッシュリ/ファレンスで悩んでいます。 my (@r); $r[1]{"A"} = "1-A"; # 代入 &s(\@r); print $r[1]{"A"},"\n"; # 参照 print $r[2]{"B"},"\n"; # 参照 サブルーチン側でできない。 # sub s() { my ($c)=@_; @$c[1]->{"A"} = "1111-AAAA"; # もちろん代入できる @$c[2]->{"B"} = "2-B"; # 代入 これができない(ハッシュリファレンスの未定義エラー) } サブルーチン側で新規ハッシュのところに代入ができないのですが どのようにすればいいのでしょうか。
- ベストアンサー
- Perl
- リファレンスをサブルーチンの戻り値にしてもOKですか?
■ サブルーチン内部で処理した結果を格納した、配列、ハッシュ、スカラーなどのデータを戻り値として利用する必要があります。その場合、どうするのが標準的なやり方でしょうか? ■ return (配列へのリファレンス, ハッシュへのリファレンス, スカラー); などとやってしまっても問題はないでしょうか? ■ 下のプログラムを試したところ、予想に反しちゃんと 「31415」と表示されました。 #!/usr/bin/perl -w sub subroutine{ my @a = (3, 1, 4, 1, 5); return \@a; } my $b = subroutine{}; print @$b; ■ サブルーチン内部で使用した変数へのリファレンスをサブルーチン 外で使っていいのだろうか? サブルーチンの処理が終了した時点でサブルーチン内部で使用した 変数はメモリーから消去されるのかと思ったものですから。
- ベストアンサー
- Perl
- ハッシュの中身の表示
ハッシュの中身の確認ができなくて困っています。 下記のような実行文においてです。 当然、test の戻り値は、スカラーとハッシュです。ハッシュを戻すときには参照渡し記号の\もつけています。 my ($return_code, %hash_data) = test(); 表示しようとすると、 Hash(0x5b04) のような表示にしかなりません、、 (試した表示方法は、下記4つです。) (環境は、WindowsXP上での、ActivePerl-5.10.0.1004 です。) foreach $key ( keys( %Hash ) ) { print "キー値 : $key\n"; print "値 : $Hash{$key} \n " } while ( ( $key , $value ) = each %Hash ){ print "キー値 : $key\n"; print "値 : $value \n " ; } use Data::Dump qw(dump); print dump(\%hash); #print %display_test; 宜しくお願いします。
- ベストアンサー
- Perl
- リファレンスの機能
リファレンスではサブルーチンとして呼び出すライブラリ自体を変数に格納することができるのでしょうか?その概念がよくわかりません。たとえば HOGE.plというプログラムがあり、 (1)use INILOAD; (2)$HOGE::INI = new INILOAD inifile=>'CONFIG.ini'; (3)($ret, $MESS, $s) = $HOGE::INI->load; このloadがどこのことなのか、を調べているうちにINILOAD.pmのなかにあることがわかったのです。 そこで(3)をとおった時点で$HOGE::INIの中身をlogで確認したら INILOAD=HASH(0x1857b04) が格納されていました。これってINILOAD.pmそのものを格納しているということでしょうか?だとすると上記文でなぜ$HOGE::INIのなかに ライブラリ名が格納されるのですか? 最後にINILOAD.pmのnewを記載します。 sub new { my($class) = shift; my($args) = {@_}; &init(); bless { INIFILE => $args->{inifile} || 'default.ini', }, $class; } sub init { my($self) = shift; $self->{STATUS} = 0; $self->{STATUS_MESS} = 'undefined'; undef $self->{DATA}; } おそらくbless以下の部分がキーになるのかとは思いますが、私の理解は 『ハッシュの引数の値をkey:inifile,値'default.ini'としてこのプログラム上で読めるようにし、それに$classを付加したものをINIFILE というグローバルな変数に代入する』 なのですが、どうもしっくりきません。ご指摘よろしくお願いいたします。
- ベストアンサー
- Perl
- サブルーチンにリファレンスを渡したのですが、うまくいきません。
以下の2つのサブルーチン「printString1」「printString2」 のうち、「printString2」はエラーになります。 このような使い方はできないのでしょうか? my $string = "string"; printString1(\$string); printString2(\$string); sub printString1{ my $refString = $_[0]; print $$refString; } sub printString2{ $_[0]; print $$_[0]; }
- ベストアンサー
- Perl
- サブルーチンへ渡した配列のリファレンスをデリファレンスするのが面倒なのですが。。
MAIN: { my @array = (1 .. 5); print three(\@array); exit; } sub three { my $array = shift; return $$array[2]; } のように、サブルーチンに配列リファレンスを渡したあと、$$array[2]のようにデリファレンスするのが面倒なのですが、 このとき$array[2]と書ける何か良い方法はないでしょうか? # 大きな配列を取り扱うので、リファレンスを使いたいんです。。 型グロブを使うことも考えたのですが、サブルーチン内でmyで宣言出来なくて、スコープ的にまずくなりそうなので断念しました; どなたかアドバイスしていただけると嬉しいです。。
- ベストアンサー
- Perl
- Perl連想配列の使い方について
はじめまして。 現在、業務で他人の書いたコード(Perl)を改造しているのですが、その作成者がいなくなってしまっております。 そのコードを見ると、なぜ、このような書き方が可能なのか、理解できないので、動作原理を教えていただけないでしょうか? 以下のようなコードです。 ==================================== my @arr = ( "一" , "ニ" , "三" , "四" ) ; my %data ; $data->{0} = \@arr ; $data{0}{test} = "テスト" ; print ${$data->{0}}[1] . "\n" ; print $data{0}{test} . "\n" ; ==================================== 出力はこのようになります。 ニ テスト ここからが質問なのですが、$data->{0}という書き方ができる理由が分からないのです。 $dataが例えば、 my %my_hash ; my $data = \%my_hash ; というように、ハッシュのリファレンスであるならば、$data->{0}という書き方も分かるのですが、定義した時点でリファレンスではない、$dataに、何故"->"の演算子が使えるのでしょうか? とはいえ、 ref $data ; の戻り値がHASHとなるのも確認しています。 これもどうしてそうなるのか、根本的な原理が分かっておりません。 どうか、このコードの動作原理を教えていただけないでしょうか。 抽象的な質問となっている気がしますが、宜しくお願いいたします。
- ベストアンサー
- Perl
- 変数の宣言を省略する
sub main { local %ren = ("suzuki","30","satou","25","tanaka","50"); &func(\%ren); print "Test ".$ren{satou}." Test";########「Test 44 Test」 } sub func { my ($hashref) = @_; $hashref->{satou} = "44"; } &main; このソースは sub func の中で「my ($hashref)」を宣言していますが 変数を用意せずに (@_)->{satou} = "44"; のようにできるならその方法を教えてください。 sub func { local (*hash) = @_; $hash{satou} = "44"; } だった場合についても教えてください。
- 締切済み
- Perl
- 二次元配列のハッシュ版の記述方法?
二次元配列のハッシュ版を実現させたいのですが、 以下の記述で正しいでしょうか? 構文に疎いので教えてください。 #!/usr/bin/perl %HASH_TEST = ( 'あ'=>{'A'=>'1', 'B'=>'2', 'C'=>'3'}, 'い'=>{'A'=>'4', 'B'=>'5', 'C'=>'6'}, ); print $HASH_TEST{'い'}{'B'}; #=> 5が表示されます。 exit; __END__
- ベストアンサー
- Perl
お礼
ありがとうございました!上手くいきました。 testサブルーチンは表記ミスです、すみません。