perl从sub返回的值混淆了
我试图从perl中的sub中获取两个不同的哈希值。散列在sub的输出中被混淆。下面是我的简化代码:perl从sub返回的值混淆了,perl,hashtable,Perl,Hashtable,我试图从perl中的sub中获取两个不同的哈希值。散列在sub的输出中被混淆。下面是我的简化代码: #!/usr/bin/perl use strict; use warnings; sub sub1 { my (%h1, %h2); $h1{'1a'}++; $h1{'1b'}++; $h2{'2a'}++; $h2{'2b'}++; while ( (my $key, my $value) = each %h1 ){ pri
#!/usr/bin/perl
use strict;
use warnings;
sub sub1 {
my (%h1, %h2);
$h1{'1a'}++;
$h1{'1b'}++;
$h2{'2a'}++;
$h2{'2b'}++;
while ( (my $key, my $value) = each %h1 ){
print "key: $key, value: $value\n";
}
print "\n";
return (%h1, %h2);
}
my (%r1, %r2) = sub1();
while ( (my $key, my $value) = each %r1 ){
print "key: $key, value: $value\n";
}
输出:
key: 1b, value: 1
key: 1a, value: 1
key: 1b, value: 1
key: 2a, value: 1
key: 2b, value: 1
key: 1a, value: 1
为什么会这样?我怎样才能纠正它?谢谢。Perl正在将两个哈希合并为一个,并将它们存储在
%r1
变量中,除非您从子例程返回引用,否则这种情况总是会发生的
sub sub1 {
my (%h1, %h2);
$h1{'1a'}++;
$h1{'1b'}++;
$h2{'2a'}++;
$h2{'2b'}++;
while ( (my $key, my $value) = each %h1 ){
print "key: $key, value: $value\n";
}
print "\n";
return (\%h1, \%h2); # \(backslash) creates a hashref
}
然后需要将这些引用存储在标量变量中:
my ($r1, $r2) = sub1(); # scalar variables with references to %h1 and %h2
# use %{ } to put $r1 in hash context
while ( (my $key, my $value) = each %{ $r1 } ){
print "key: $key, value: $value\n";
}
# prints
# key: 1b, value: 1
# key: 1a, value: 1
# key: 1b, value: 1
# key: 1a, value: 1
Perl正在将两个哈希合并为一个,并将它们存储在
%r1
变量中,除非您从子例程返回引用,否则这种情况总是会发生
sub sub1 {
my (%h1, %h2);
$h1{'1a'}++;
$h1{'1b'}++;
$h2{'2a'}++;
$h2{'2b'}++;
while ( (my $key, my $value) = each %h1 ){
print "key: $key, value: $value\n";
}
print "\n";
return (\%h1, \%h2); # \(backslash) creates a hashref
}
然后需要将这些引用存储在标量变量中:
my ($r1, $r2) = sub1(); # scalar variables with references to %h1 and %h2
# use %{ } to put $r1 in hash context
while ( (my $key, my $value) = each %{ $r1 } ){
print "key: $key, value: $value\n";
}
# prints
# key: 1b, value: 1
# key: 1a, value: 1
# key: 1b, value: 1
# key: 1a, value: 1
你也许应该好好读一读 Perl子例程可以获取参数列表并返回列表。例如,如果我这样做:
array_sub ( @a, @b );
sub array_sub {
return print join ( ": ", @_ ) . "\n";
}
您将注意到的是,传递的两个数组将合并到一个参数列表中,而没有任何方法来告诉一个列表从何处开始,另一个列表从何处结束
散列也会发生类似的情况:
array_sub ( %a, %b );
sub array_sub {
return print join ( ": ", @_ ) . "\n";
}
这将把两个哈希(及其键)合并到一个列表中,并传递给子例程
要绕过此限制,可以使用基本上是标量值的引用,这些标量值指向实际数组或哈希所在的内存位置:
array_sub { \@a, \@b );
sub array_sub {
my $ref_a = shift;
my $ref_b = shift;
my @sub_a = @{ $ref_a };
my @sub_b = @{ $ref_b };
在上面,我在数组前面加了一个反斜杠,以获得对数组的引用。为了取消对它们的引用(即将它们转换回数组),我在引用周围放置了@{…}
您必须在代码中执行类似的操作:
my ($r1, $r2) = sub1(); #Returns references;
my @r1 = @{ $r1 }; #dereference
my @r2 = @{ $r2 }; #dereference
在您的子程序中:
sub sub1 {
...
return \%h1, \%h2;
你也许应该好好读一读 Perl子例程可以获取参数列表并返回列表。例如,如果我这样做:
array_sub ( @a, @b );
sub array_sub {
return print join ( ": ", @_ ) . "\n";
}
您将注意到的是,传递的两个数组将合并到一个参数列表中,而没有任何方法来告诉一个列表从何处开始,另一个列表从何处结束
散列也会发生类似的情况:
array_sub ( %a, %b );
sub array_sub {
return print join ( ": ", @_ ) . "\n";
}
这将把两个哈希(及其键)合并到一个列表中,并传递给子例程
要绕过此限制,可以使用基本上是标量值的引用,这些标量值指向实际数组或哈希所在的内存位置:
array_sub { \@a, \@b );
sub array_sub {
my $ref_a = shift;
my $ref_b = shift;
my @sub_a = @{ $ref_a };
my @sub_b = @{ $ref_b };
在上面,我在数组前面加了一个反斜杠,以获得对数组的引用。为了取消对它们的引用(即将它们转换回数组),我在引用周围放置了@{…}
您必须在代码中执行类似的操作:
my ($r1, $r2) = sub1(); #Returns references;
my @r1 = @{ $r1 }; #dereference
my @r2 = @{ $r2 }; #dereference
在您的子程序中:
sub sub1 {
...
return \%h1, \%h2;