Perl:这段代码怎么可能有效呢?

use*_*985 3 perl hash scalar

my %hash = ('red' => "John", 'blue' => "Smith"); 
func (%hash);  

sub func {
    my $hash = $_[0];
    print "$hash{'red'}\n";
    print "$hash{'blue'}\n";
}
Run Code Online (Sandbox Code Playgroud)

我将哈希发送到子例程,并将此哈希视为标量.如果是这样,我怎么可能通过调用它的键来转向哈希值?

ike*_*ami 12

func(%hash);
Run Code Online (Sandbox Code Playgroud)

相当于

func('red', 'John', 'blue', 'Smith'); 
   -or-
func('blue', 'Smith', 'red', 'John'); 
Run Code Online (Sandbox Code Playgroud)

所以

my $hash = $_[0];
Run Code Online (Sandbox Code Playgroud)

相当于

my $hash = 'red';
   -or-
my $hash = 'blue';
Run Code Online (Sandbox Code Playgroud)

完全没用.你永远$hash不会再使用的好东西.


相反,您使用%hashsub之外的声明.您可以通过重新排序代码或限制范围(可见性)来查看%hash.

use strict;
use warnings;

{
    my %hash = ('red' => "John", 'blue' => "Smith"); 
    func(%hash);  
}

sub func {
    my $hash = $_[0];
    print "$hash{'red'}\n";
    print "$hash{'blue'}\n";
}
Run Code Online (Sandbox Code Playgroud)

$ perl a.pl
Global symbol "%hash" requires explicit package name at a.pl line 11.
Global symbol "%hash" requires explicit package name at a.pl line 12.
Execution of a.pl aborted due to compilation errors.
Run Code Online (Sandbox Code Playgroud)

解决方案是传递参考.

use strict;
use warnings;

{
    my %hash = ('red' => "John", 'blue' => "Smith"); 
    func(\%hash);
}

sub func {
    my $hash = $_[0];
    print "$hash->{'red'}\n";
    print "$hash->{'blue'}\n";
}
Run Code Online (Sandbox Code Playgroud)