配列内の配列へのアクセス

私は別の出力を生成する2ビットのコードを持っていますが、なぜそれを理解するのが非常に難しいですか。

コードスニペット1:

my @args = $bighash{'arguments'}{'allocations'};
print "$args[0][1]";

コードスニペット2:

my @args = $bighash{'arguments'}{'allocations'}[0];
print "$args[1]";

最初のケースでは、私が期待している値を表示しています。後者の場合、何も印刷されません。誰もこれを説明できますか?

1
引数を引用する必要はありません。
追加された 著者 Eric Strom,
このコードは間違っているようです:Ericが指摘したように、ハッシュのものは配列ではなく、配列の参照になります。だから私の$ args = $ bighash ...でなければなりません。 $ args - > [0] - > [1];を出力します。 Data :: Dumperを使ってすべてを印刷し、 perldoc.perl.org/perlreftutを見てください。 .html
追加された 著者 Øyvind Skaar,

3 答え

ハッシュに格納されている値は配列参照です。リファレンスを直接操作することができます:

my $args = $bighash{'arguments'}{'allocations'};
print $$args[1];  # or $args->[1]

または、配列を新しいものに展開することもできます:

my @args = @{ $bighash{'arguments'}{'allocations'} };
print $args[1];

詳細については、 perlref および perldsc のマニュアルページを参照してください。

2
追加された
print $ bighash {arguments} {allocations} [0] [1]; は何を出力しますか?
追加された 著者 Eric Strom,
うん、申し訳ありませんが、私はあなたの質問を誤解しました。答えは正しいはずです。
追加された 著者 Eric Strom,
私はこれらの両方を試みたが、悲しいことに何も印刷していない。
追加された 著者 Adam S,
それは何も印刷しません。
追加された 著者 Adam S,
実際、私はそれが分かったと思う。私は[0]なしであなたの2番目のソリューションを使用しています。
追加された 著者 Adam S,
ダブルドル記号の意味は?
追加された 著者 naught101,

エリック・ストロムの答えは基本的に正しいです...しかし、私は誰もあなたが働いているデータ構造を調べるためにData :: Dumperを使うことを提案していないことに驚いています。あなたはあなたがしたこととエリックの訂正の違いを実際に見ることができます。これは物事をあなたのためにまっすぐにするのに役立つかも

Re:use warnings ...新しく作成された配列の存在しない要素を印刷しようとすると警告が出るはずですか?私はかつて私が厳しいと警告を使用するまでオンラインで何かを尋ねることはないと言われました。それはちょっと極端ですが、-wとData :: Dumperは間違いなく私を助けます:-)

2
追加された
誰かがData :: Dumperの使用を提案しています。彼らはコメントとして投稿しました。
追加された 著者 Brad Gilbert,

コードスニペット2では、効果的にbighashの最初の要素([0]が最初の要素です)をとり、それを配列の唯一の要素として入れます。次に、存在しない2番目の要素を求めます。

'警告を使用する'ことを覚えている場合は、配列としてスカラーを割り当てるので、これは1を返すはずです。私はこれを自分でテストしていません。

0
追加された
ここに警告はありません。スカラーを配列に代入するのは問題ありません。ただ1つの要素を持つ配列を作成するだけです。
追加された 著者 Eric Strom,
うわー...それは私の意図ではありませんでした。代入演算子は、新しい配列に「挿入」または「追加」として効果的に機能しますか? $ bighash {'arguments'} {'allocation'}の参照となる新しい配列を作成するにはどうすればよいですか?
追加された 著者 Adam S,
Adam:あなたは..への参照である配列を作成しません。配列への参照を作成します。参照自体は配列ではありません。
追加された 著者 Øyvind Skaar,
そうです、エリックは正しいです。
追加された 著者 ath88,