我正在做这个:
foo(('x' => 'y'), 'bar');
use strict;
sub foo {
my ($hash, $s) = @_;
my %e = %$hash;
print %e{'x'};
print $s;
}
我得到:
Can't use string ("x") as a HASH ref while "strict refs" in use at a.pl line 7.
将哈希值和标量传递给子例程的正确方法是什么?
('x' => 'y')
不是一个“哈希”,它是一个包含两个元素的列表,括号甚至都不重要。你所说的与foo('x', 'y', 'bar')
相同。
如果要传递 hashref 作为第一个参数,可以使用匿名哈希引用构造函数:
foo({ x => 'y' }, 'bar')
。
旁注:
print %e{'x'}
应该是print $e{'x'}
。或者更简单地说,您可以使用 ->{}
运算符同时取消引用和访问:print $hash->{'x'}
。
您已经得到了一个指向您参考的答案,并且您已经接受了 - 这很棒。
但我只是想补充一点,最简单的解决方法是交换参数的顺序并对子例程进行一个微小的更改。
foo('bar', ('x' => 'y'), 'bar');
sub foo {
# NOTE: %hash, not $hash
my ($s, %hash) = @_;
# And there's no need for %e now
print $hash{'x'};
print $s;
}