• ベストアンサー

無名配列からハッシュを作りたいのですが・・・

ryu_chanの回答

  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.2

以下のようにハッシュスライスを使うのはいかがでしょうか? @a{@$VAR1} = @Array; 疑問というか、以下の処理がちょっと謎です。 foreach(0..$#List){ @Array=split(/<>/,$List[$_]); } こう↓したいわけではないでしょうか? foreach(0..$#List){ push @Array, [ split(/<>/,$List[$_]) ]; }

taku0
質問者

お礼

ご教授頂きありがとうございます。 foreach(0..$#List){ push @Array, [ split(/<>/,$List[$_]) ]; } についてですが、@Listが無名配列の場合は、そのようにすればよいのかな・・と思うのですけど、通常の配列の場合ですと @Array=split(/<>/,$List[$_]); で代入されるようです。

taku0
質問者

補足

ハッシュのスライスというのがあるんですね。有難う御座います。 @a{@$VAR1} = @Array; の@a{}となっているのに疑問を持ちつつ、勝手に配列のスライスと勘違いして調べてましたw で、私の方で表示テストを行ってみたのですが、@a{@$VAR1}の中身の確認が出来ませんでした。 後、大前提としてですが、 --List----------------------- 1<>あ<>い<>う<>え<>お<> ------------------------- の中身は1行のみでした。すいません foreach(0..$#List){ push @Array, [ split(/<>/,$List[$_]) ]; } のご教授有難う御座います。 で、それを前提に my@Array; my%a; foreach(0..$#List){ @Array=split(/<>/,$List[$_]); } @a{@$VAR1} = @Array; print "■テスト表示<br><br>"; print "\@a=@a<br>"; print "\@$a=@$a<br>"; print "\$a[0]=$a[0]<br>"; print "\$a[0]->{BCorpName}=$a[0]->{a}<br>"; print "\$a->[0]->{a}=$a->[0]->{a}<br>"; print "\$a[0]{a}=$a[0]{a}<br>"; print "\$a{a}=$a{a}<br>"; とテスト表示してみたのですが、中身が何も表示されず use Data::Dumper; open(F,"> Datadump_a.txt") ; # 保存するファイルを開く print F Dumper(\%a,*a); # 連想配列の内容をファイルに書き出す #print F Dumper(\@a); # 連想配列の内容をファイルに書き出す #print F Data::Dumper->Dump( [ \%a ] , [ '*a' ] ); close(F); として内容を確認してみたのですが、中身が何も入ってないようです。 今回の件で私自身ハッシュや配列のスライスについて、もう少し勉強が必要な事を痛感させられました。 お手数ですが、上記の件についてもし何かご助言いただけます様でしたら幸いです。 宜しくお願い致します。

関連するQ&A

  • 動的なハッシュの配列を作成したい

    #お世話になります。最終的には、下記のように配列の順番にハッシュを作成したいのですが、ご教授願えませんでしょうか #!/usr/bin/perl #想定される配列 @array=(0,2,4,6,8,1,3,5,7,9); #下記が最終的に動的に作成したいハッシュの形です。 %List = ( '0' => [ (@array0_n) ], '2' => [ (@array2_n) ], '4' => [ (@array4_n) ], '6' => [ (@array6_n) ], '8' => [ (@array8_n) ], '1' => [ (@array1_n) ], '3' => [ (@array3_n) ], '5' => [ (@array5_n) ], '7' => [ (@array7_n) ], '9' => [ (@array9_n) ], ); $a='array'; $n='_n'; foreach (@array){ #試行錯誤中... print "\@{${a}[$_]{$n}}=@{${a}[$_]{$n}}"; } __END__; お忙しいかとは存じますが、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 無名配列や無名ハッシュの値を変更し保存する際、

    Data::Dumper(Data::Dumperにこだわるわけではないのですが)を使って無名配列or無名ハッシュの値(40万行程度あると仮定。 例) $VAR1 = { 'aaa' => {'get' => '1','all' => '0'}, 'bbb' => {'get' => '1','all' => '1'}, } といった形)を変更後、保存する場合、その配列orハッシュ全体を読み込んで保存する形になるのでしょうか、それとも、配列orハッシュ全体を読み込まず各値に対するアドレスから実体(リファレンス/シンボリックリファレンスの概念が明確にわかってないのですが)へアクセスして値を変更=そのまま保存するようになのでしょうか。 諸先輩or先生方、お手数ですがこの辺りの仕組みについてご教授願えますと幸いです。宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 静的ハッシュの配列のキーに対応する値の数の多さ順で表示させたい

    ハッシュのキーに対応する値の数の多さ順で表示させたいと考え、下記の所まで試行錯誤しておりますが、どうにも思ったようにソートできずにおります。 #!/usr/bin/perl use strict; my(%a, $i, $j ,$allarray ,@keys ,@keys2 ,%hash ,%files ,$a_mumei_ref ,$key ,$value ,@value ,$x ,$files); # ハッシュの配列を静的に作る %a = ( '0' => [ qw(0) ], '1' => [ qw(1 1) ], '3' => [ qw(3 3 3) ], '7' => [ qw(7 7 7) ], '2' => [ qw(2) ], '4' => [ qw() ], '5' => [ qw() ], '6' => [ qw() ], '8' => [ qw(8 8) ], '9' => [ qw(9) ], ); @keys = sort { $hash{$b} <=> $hash{$a} || length($b) <=> length($a) || $a cmp $b } keys %a; #ハッシュのキーを数字順で表示 foreach (@keys){ print $_ ."\n"; } # 静的に作ったハッシュの配列を取り出してみる foreach $i (sort keys %a) { for ($j = 0; $j <= scalar(@{$a{$i}})-1; $j++) { print '$a{'. $i. '}['. $j. ']='. $a{$i}[$j]. ' '; } $allarray=scalar(@{$a{$i}})-1; print "No$i:kosuu:$allarray"; print "\n"; #配列の値の個数を調べその配列を作成 my($a_mumei) = $allarray; $a_mumei_ref = \$a_mumei; $files{"$i"}=($i,$a_mumei_ref); } #each関数で%filesの中身を表示 while ( ( $key , $value ) = each %files ){ print "key:$key value:$$value\n" ; } #試行錯誤 foreach $x (sort { $files{$b} <=> $files{$a} } keys %files){ print "$x => $files->{$x}\n"; } @keys2 = sort {$hash{$a} <=> $hash{$b}} keys %files; #@keys2 = sort { $hash{$b} <=> $hash{$a} || length($b) <=> length($a) || $a cmp $b } keys %files; #@keys2 = sort { $hash{$a} cmp $hash{$b} } keys %files; print "@keys2\n"; print "\n"; __END__; 私のイメージしておりますのは、ソートした結果がハッシュのキーに対応する値の数の多さ順で下記のように表示させたいのですが、 どのようにすれば可能でございますか、ご教授願えませんでしょうか key:3 value:2・・・この場合valueは配列の個数 key:7 value:2 key:8 value:1 key:1 value:1 key:9 value:0 key:2 value:0 key:0 value:0 key:6 value:-1 key:4 value:-1 key:5 value:-1

    • ベストアンサー
    • Perl
  • Perlでハッシュや配列で重複するキーについて

    ハッシュで重複するキーが値となるので、このハッシュはabdの3つのキーしか存在しないということでしょうか? %a = ('a'=>1, 'b'=>2, 'a'=>3, 'd'=>4); また、配列の場合はabadと4つ数になるということでしょうか? @a = ('a','b','a','d'); この場合配列で、重複する値を抽出するアルゴリズムが知りたいです。

    • ベストアンサー
    • Perl
  • ハッシュ内の各値部分に配列を展開したい

    ハッシュ内の各値部分に配列を展開したいのですが、下記のようにしてみてるのですが、配列が全部展開されず、はまっております。宜しければご教授願えませんでしょうか。 use Data::Dumper; $Data::Dumper::Indent = 1; $dumpfile='dump.txt'; my @all = (aaa ,bbb); my @cate = qw(yyy zzz); my %hash; foreach my $a ( @all ) { foreach $b ( @cate ) { $hash{$a}[$b] = "$b"; } } open(F,"> $dumpfile") ; print F Dumper(\%hash); close(F); ■実行結果 $VAR1 = { 'bbb' => [ 'zzz' ], 'aaa' => [ 'zzz' ] }; ■イメージしている形 $VAR1 = { 'bbb' => ['yyy','zzz'], 'aaa' => ['yyy','zzz'], }; お手数ですが宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 多次元配列で、foreachを使って、key値を

    多次元配列で、foreachを使って、key値を入れ替えているのですが、 なんで、こうなるか分かりません。  $x = array();  $x[] = array(   "id" => 1,   "name" => "JavaScript",  );  $x[] = array(   "id" => 5,   "name" => "PHP",  );  $z = array();  foreach($x as $key => $value){   $z[$value["id"]] = $value;   }  print_r($z); 配列のKEYをIDに変更しているのですが、 なんで、こうなるのでしょうか? 特に、  $z[$value["id"]] = $value; が分かりません。 例えば、foerachの途中で、var_dumpすると、 1回目だと、 ◆$key 0 ◆$value Array (  [id] => 1  [name] => JavaScript ) ◆$value["id"] 1 まではいいのですが、 ◆$z[$value["id"]] の値が見れません。 ここはどんな処理をやっているのでしょうか?

    • ベストアンサー
    • PHP
  • ハッシュの中身の表示

    ハッシュの中身の確認ができなくて困っています。 下記のような実行文においてです。 当然、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
  • 動的ハッシュを作って取り出したいのですが・・・

    お世話になります。 フォームから送られてくるデータを動的に作ったハッシュで参照出来るように取り組んでるんですが、思ったように出来ず思い悩んでおります。 どうすれば、意図した形でデータを取り出すことが出来ますでしょうか my %FORM = ( 'd01' => 'あ', 'd02' => 'い', 'd03' => 'う', 'd04' => 'え', 'd05' => 'お', 'd06' => 'か', 'd07' => 'き', 'd08' => 'く', 'd09' => 'け', 'd10' => 'こ', ); for(sort { $FORM{$a} cmp $FORM{$b} } keys %FORM){ print "$_ = $FORM{$_} \n"; } $list="d01,d02,d03,d04,d05,d06,d07,d08,d09,d10,"; $i=-1; foreach (split/,/,$list){ $i++; $hash{$_}=$i; } for(sort { $hash{$a} <=> $hash{$b} } keys %hash){ print "$_ = $hash{$_} \n"; $view = ${"FORM$_"}; print "$view\n"; }; 最後のprint "$view\n";箇所で、 $list="d01,d02..." を split/,/,$list したので、 $FORM{d01} $FORM{d02} となるようにして、 「あ い う え お」と取り出したいのです。 ご教授のほど、よろしくお願い致します。

    • ベストアンサー
    • Perl
  • 配列型の宣言?

    こんにちは。 あるサイトで見たphpのサンプルなのですが、 postされた全ての値を配列に格納するもので、以下のような記述がありました。 foreach((array)$_POST as $key => $value){  $array[$key] = $value; } ポストされた全ての値を、配列$arrayに連想配列として格納しているのはわかるのですが、 foreachの、(array)というのはどういう働きをするものなのでしょうか。 これは、$_POSTが配列であるという宣言でしょうか。 それと、postされた値がない場合、$_POSTを配列だと宣言しておくことで、foreachのエラーを回避するような役割もあるのでしょうか。 恥ずかしながら、(array)のような記述をphpではあまり見ないような気がするのですが、なんというキーワード(?)で勉強すれば理解が深められるかもご教授頂けますと助かります。 宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • foreachで多次元配列を生成

    こんにちわ。 配列をforeachでループさせて、それを多次元配列に入れていくことは可能でしょ うか? 例えば以下のようなデータがあるとします。 ---meibo.dat-------- c21<>田中<>21<>東京 c22<>佐藤<>22<>大阪 -------------------- ---test.php----------------------------------------------------- <? $list_meibo = file("meibo.dat"); foreach($list_meibo as $temp){    $i=split("<>",$temp);    $a=array($i[0] => array("name"=>$i[1],"age"=>$i[2],"ad"=>$i[3]),); } ?> ------------------------------------------------------------------- これでは $a=array("c21"=>array("name"=>"田中","age"=>"21","ad"=>"東京"), "c22"=>array("name"=>"佐藤",age"=>"21","ad"=>"大阪"),); という具合になってくれないでしょうか? これでいくと、配列の最後の要素のみデータに残ります。 どのようにしたらよいでしょうか? ご教授お願いします。

    • ベストアンサー
    • PHP