• ベストアンサー

ハッシュの中に格納された配列の要素数を得る方法

予想配列のあるキーを配列とします。 %hash; @hash{'a'}=['aa','ab','ac']; 一方で普通の配列をスカラ変数として扱うと配列数を表します。 @array=(a,b,c,d,e); $num=@array; # $numは5になる。 それでは $num=@hash{'a}; あるいは  $num=@{hash{'a'}}; としたらどうなるのって ARRAY(0x2438c4) みたいになって、$numに@hash{'a'}の要素数は入りません。 予想配列の中に格納された配列の要素数を取り出す簡便な方法はないものでしょうか。 お手数をお掛けします。

  • Perl
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • sample_
  • ベストアンサー率76% (20/26)
回答No.1

えっと、まず予想配列じゃなくて連想配列ですね。 まず、ハッシュのキーに対し配列自身を格納することはできません。 たぶん、配列を入れたいので@をつけられたのだと思いますがこれはこれで別の意味になってしまいます。 では、どうすればよいかと言いますと、配列自身の代わりに、 データーの保存されている場所(Cで言うとこのポインターの考え)を 格納することなら可能です。 リファレンスと呼ばれている物です。 リファレンスは、あくまでもデータの保存場所情報なので実際に配列の要素数を知りたいとなるとデリファレンスが必要です。 質問者様のコードを、文法に沿って解釈すると %hash; #ハッシュを用意する @hash{'a'}=['aa','ab','ac']; #ハッシュのスライス(左辺)に配列のリファレンス(右辺)を格納する。本来右辺はリストを期待している。 $num=@hash{'a'}; #右辺はハッシュのスライス。リストのうち一番最後の要素が左辺に格納される。ここでは配列のリファレンス といった感じです。 ただしくは、 %hash; $hash{'a'} = ['aa', 'ab', 'ac']; $num = @{$hash{'a'}}; print $num, "\n"; #3と表示される 2行目の$hash{'a'}は、配列の保存場所というスカラー(単一) データを格納しているの$が正解となります。 そして、3行目の@{ $hash{'a'} } でリファレンス(保存場所の情報)から 実際のデータ(ここでは配列)にするためにデリファレンスを行っています。

makoji
質問者

お礼

どうもありがとうございます。 長らく放置して申し訳ありませんでした。

その他の回答 (1)

  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.2

誤> 予想配列 正> 連想配列またはハッシュ 誤> @hash{'a'}=['aa','ab','ac']; # この間違いが、最後の結果を不可解にしてる 正> $hash{'a'}=['aa','ab','ac']; # ハッシュ要素に配列を入れる ちなみに、 @hash{'a1', 'a2', 'a3'} の書式はハッシュスライスと言って、 ($hash{'a1'}, $hash{'a2'}, $hash{'a3'}) と等価です。 同様に、@hash{'a'} は ($hash{'a'}) という 要素数1 の配列です。 誤> $num=@hash{'a}; 誤> $num=@{hash{'a'}}; # おしい。 正> $num=@{$hash{'a'}}; # ハッシュ要素に入った配列の要素数

makoji
質問者

お礼

どうもありがとうございます。 長らく放置して申し訳ありませんでした。

関連するQ&A

  • 16進数を2文字ずつ配列に格納したい

    16進数を配列に格納するのに2文字ずつ格納したいのですがどうしたらいいですか。 例えば num=ef23157をa[0]=57,a[1]=31,a[2]=f2,a[3]=0e, のように1バイトずつ格納したいのですが、方法がわかりません。 お願いします。

  • 参照配列の要素数の求め方は?

    リファレンス配列の要素数は、$#では求められないのでしょうか? ------------------------------------- foreach $i(0 .. 3){ $hash->[$i] = $i * 100; } print "\%hashの要素数->$#hash\n"; $ref = \%hash; print "\%{$ref}の要素数->$#{$ref}\n"; -------------------------------------

    • ベストアンサー
    • Perl
  • 配列から別の配列の要素を削除する方法

    ある配列array_aに、100件の文字列要素が格納されています。 別の配列array_bには、80件の文字列要素が格納されています。 array_aの要素、array_bの要素共に重複するものはありません。 array_b中に存在する要素はすべてarray_a中にも存在します。 array_aにあり、array_bにはない要素で構成されたarray_cの作り方を教えてください。 例えば $array_a=array("a","b","c","d","e","f","g"); $array_b=array("e","b","d"); なら、 $array_c=array("a","c","f","g") になります。 配列array_aとarray_bは、 $array_b=array("b","b","d"); であったり、 $array_a=array("a","a","b","c","d","e","f","g"); といった「重複する要素を含むパターン」はありません。要素はすべてユニークです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 二次元配列における要素数のはじき出し

    普通、配列の要素数を出すとき $num = @list; で良いですよね? ですが、二次元配列で、 $num = @list[1]; って形にするとエラーになります。 どうすればいいのでしょうか?

    • ベストアンサー
    • Perl
  • Excel(VBA)で配列の要素数を調べるには?

    お世話になります。 ExcelのVBAで、split関数を使って配列に格納したデータの要素数を調べる方法がわかりません。 下記のようなコードで、読み込んだデータを配列(Arraydata)に格納することは出来たのですが、test.csvの要素数が処理の度に変わるため、要素数に応じて後続の処理を行ないたいと考えています。 Open test.csv For Input As #1 ' test.csvファイルを開く Line Input #1, test.csv ' データ行を読み込む Arraydata = Array(Split(test.csv, ",")) ' 配列に格納 よろしくお願いします。

  • 配列の要素数に変数を入れたいときには

    よろしくお願いします。 配列の要素数には定数しか入れられないのですが,どうしても変数を入れたいときは,それを引数として関数を呼び出すしか方法はないでしょうか。 具体的には,scanfで手に入れたint型の変数を要素数とする配列を宣言したいのですが,どうすれば良いでしょうか。 ご教授ください。

  • 配列の要素数について

    下記の記述の場合、配列の要素数っていくつになりますか? Dim strArray() As String ReDim strArray(0) また下記のように、配列の要素数を具体的に書かずに使った場合不具合はでますか? Dim strArray() As String strArray(0) = "aa" strArray(1) = "bb"

  • 一致する要素が格納されている添え字番号を返す

    例えばある配列内に @moji = (ak, df, gc); などという値でも文字でもが格納されていたとして、 $x = "ak"; といったある変数に格納されている値・文字(この場合はak)と一致する要素が配列@mojiに格納されていた場合に、その格納されている要素の添え字番号(配列の添え字番号)を返すような関数はないでしょうか? イメージとして $res = mch($x); とすると、0が返されて$resに格納されるというものです。 ちなみにRという言語では > a <- c("ljj", "B0", "op199") # 変数aに3つの文字列要素を代入する > res <- which(a == "op199") # which()は引数に指定された論理に一致する要素番号を返す > res # aについて,a == "op199"がTRUEとなるのは要素番号3であるから,3を返す [1] 3 というものがあるのですが、これと同じような関数が欲しいのです(泣)

    • ベストアンサー
    • Perl
  • 「要素数が変動する連想配列」に、新たなキーを指定した上で、配列を追加し

    「要素数が変動する連想配列」に、新たなキーを指定した上で、配列を追加したいのですが、 どうすればよいでしょうか? 元の連想配列$hash1 "ヨーロッパ"=>"スペイン", "南米"=>"ブラジル" 追加したい配列$hash2 [0]=>"東京", [1]=>"名古屋" array_pushしたら、下記のようになりました。 "ヨーロッパ"=>"スペイン", "南米"=>"ブラジル" [0]=> ______[0]=>"東京" ______[1]=>"名古屋" これを、下記のようにするには、どうしたらよいでしょうか? "ヨーロッパ"=>"スペイン", "南米"=>"ブラジル", "アジア"=> ______[0]=>"東京", ______[1]=>"名古屋"

    • ベストアンサー
    • PHP
  • 配列やハッシュで中身が同じか簡単に調べることは可能でしょうか?

    スカラ型なら my $a = "a"; my $b = "b"; if( $a eq $b)の用に比較が簡単に出来ますが、 配列やハッシュはどのように中身が同じかどうか調べることは可能でしょうか? 配列でも複雑な(例えば配列のデータがハッシュ値)のような以下の ものを中身が同じが比較する方法です。 固定でなく、どんなデータが入ってきても数やキーが異なっても比較する方法が知りたいです。 my @ary1 = (); $ary[0]{'test_a'} = "a"; $ary[0]{'test_b'} = "b"; $ary[1]{'test_a'} = "aa"; $ary[1]{'test_b'} = "bb"; my @ary2 = (); $ary[0]{'test_a'} = "aa"; $ary[0]{'test_b'} = "bb"; $ary[1]{'test_a'} = "aaa"; $ary[1]{'test_b'} = "bbb";

    • ベストアンサー
    • Perl

専門家に質問してみよう