1

私はPerlでハッシュをいじっています。以下は期待どおりに機能します。

use strict;
use warnings;

sub cat {
        my $statsRef = shift;
        my %stats = %$statsRef;

        print $stats{"dd"};
        $stats{"dd"} = "DDD\n";
        print $stats{"dd"};
        return ("dd",%stats);
}

my %test;
$test{"dd"} = "OMG OMG\n";

my ($testStr,%output) = cat (\%test);
print $test{"dd"};

print "RETURN IS ".$output{"dd"} . " ORIG IS ". $test{"dd"};

出力は次のとおりです。

OMG OMG
DDD
OMG OMG
RETURN IS DDD
 ORIG IS OMG OMG

ただし、配列をミックスに追加すると、エラーが発生します。

use strict;
use warnings;  sub cat {
        my $statsRef = shift;
        my %stats = %$statsRef;

        print $stats{"dd"};
        $stats{"dd"} = "DDD\n";
        print $stats{"dd"};         return ("dd",("AAA","AAA"),%stats); }
 my %test; $test{"dd"} = "OMG OMG\n";

my ($testStr,@testArr,%output) = cat (\%test);
print $test{"dd"};

print "RETURN IS ".$output{"dd"} . " ORIG IS ". $test{"dd"}. " TESTARR IS ". $testArr[0];

出力は次のとおりです。

OMG OMG
DDD
OMG OMG
Use of uninitialized value in concatenation (.) or string at omg.pl line 20.
RETURN IS  ORIG IS OMG OMG
 TESTARR IS AAA

配列は表示されるのにハッシュが表示されないのはなぜですか?

4

2 に答える 2

7

すべてのリストは、Perl で自動的にフラット化されました。したがって、代入演算子は、サブルーチンによって返されるリスト間の境界を魔法のように区別することはできません。あなたの場合、 @testArr はによって与えられた結果のリストを消費しcat、 %output はそれを取得しないことを意味します-したがって、Use of unitialized value...警告です。

特にハッシュまたは配列を返す必要がある場合は、参照を使用します。

return ("dd", ["AAA", "AAA"], \%stats);

...そしてその後、割り当てで:

my ($testStr, $testArrayRef, $testHashRef) = cat(...);
my @testArray = @$testArrayRef;
my %testHash  = %$testHashRef;
于 2012-06-19T15:59:06.543 に答える
4

raina77ow による回答に加えて、型から参照に変換して再び元に戻すのではなく、単に参照を渡すことを強くお勧めします。読みやすく、コーディングの手間がかかりません(imho)

use Data::Dumper;
use strict;
use warnings;
sub cat {
    my $statsRef = shift;
    print $statsRef->{"dd"} ;
    $statsRef->{"dd"} = "DDD\n";
    print $statsRef->{"dd"} ;
    return ("dd",["AAA","AAA"],$statsRef); 
}

my $test = {} ;
$test->{"dd"} = "OMG OMG\n";

my ( $var, $arrRef, $hashRef ) = cat($test) ;

print "var " . Dumper($var) . "\n" ;
print "arrRef " . Dumper($arrRef) . "\n";
print "hashRef " . Dumper($hashRef) . "\n";
于 2012-06-19T16:07:49.173 に答える