6

ハッシュを返すサブルーチンがあります。サブルーチンの最後の行:

print Dumper(\%fileDetails);
return %fileDetails;

この場合、ダンパーは次を出力します。

$VAR1 = {
          'somthing' => 0,
          'somthingelse' => 7.68016712043654,
          'else' => 'burst'
}

しかし、次の行でサブルーチンを呼び出してダンプしようとすると:

print Dumper(\fileDetailsSub($files[$i]));

ダンパーは次のように出力します:

$VAR1 = \'somthing';
$VAR2 = \0;
$VAR3 = \'somthingelse';
$VAR4 = \7.68016712043654;
$VAR5 = \'else';
$VAR6 = \'burst';

ハッシュが壊れたら、もう使えません。なぜそれが起こるのですか?また、サブルーチンの戻り時に適切な構造を維持するにはどうすればよいですか?

ありがとう、マーク。

4

5 に答える 5

11

Perl にはハッシュを返すようなものはありません。

サブルーチンは引数としてリストを取り、結果としてリストを返すことができます。リストは配列とは大きく異なる生き物であることに注意してください。

あなたが書くとき

return %fileDetails;

これは次と同等です。

return ( 'something', 0, 'somethingelse', 7.68016712043654, 'else', 'burst' );

サブルーチンを呼び出してそのリストを取得するときにできることの 1 つは、それを新しいハッシュに割り当てることです。

my %result = fileDetailsSub();

キーと値のペアのリストを使用してハッシュを初期化できるため、これが機能します。(これ(foo => 42, bar => 43 )は と同じことを覚えておいてください('foo', 42, 'bar', 43)

のように、ハッシュにバックスラッシュ参照演算子を使用すると、ハッシュを指すスカラーであるハッシュ参照\%fileDetailsが得られます。

同様に、 と書く\@arrayと、配列参照が得られます。

ただし、 list で参照演算子を使用すると、リストへの参照は取得されません (リストは変数ではない (一時的なもの) ため、参照できません)。代わりに、参照演算子はリスト項目に分散します。 、 それで

\( 'foo', 'bar', 'baz' );

新しいリストを作成します:

( \'foo', \'bar', \'baz' );

(この場合、スカラー参照でいっぱいのリストを取得します。) サブルーチンの結果を試してみると、次のようDumperになります。サブルーチンから返されたアイテムのリストに分散された参照演算子です。

したがって、1 つの解決策は、Dumper を使用する前に結果リストを実際のハッシュ変数に割り当てることです。もう1つは、サブからハッシュ参照(とにかくダンプしているもの)を返すことです:

return \%fileDetails;

...

my $details_ref = fileDetailsSub();
print Dumper( $details_ref );

# access it like this:
my $elem = $details_ref->{something};
my %copy = %{ $details_ref };

もっと楽しくするには、以下を参照してください。

于 2013-05-28T15:47:09.497 に答える
8

代わりにハッシュへの参照を返さないのはなぜですか?

return \%fileDetails;

それがレキシカル変数である限り、サブルーチンの他の使用法を複雑にすることはありません。すなわち:

sub fileDetails {
    my %fileDetails;
    ... # assign stuff
    return \%fileDetails;
}

実行がサブルーチンを離れると、変数はスコープ外になりますが、メモリに含まれるデータは残ります。

Dumper の出力がそのように見える理由は、参照リストをフィードしているためです。サブルーチンは配列やハッシュを返すことができず、スカラーのリストのみを返すことができます。あなたがしていることは次のようなものです:

print Dumper \(qw(something 0 somethingelse 7.123 else burst));
于 2013-05-28T15:35:30.530 に答える