perl:从包含对它的引用的哈希中打印字符串

perl:从包含对它的引用的哈希中打印字符串,perl,Perl,对不起,如果这是一个坏标题 我有以下散列: my %map = ( 'key1', 'hello', 'key2', \'there' ); print Dumper(\%map); 输出: $VAR1 = { 'key2' => \'there', 'key1' => 'hello' }; 我想打印出'key2'处的值。以下是我尝试过的: print "$map{key2}" => SCALAR(0x2398b08) print "$$ma

对不起,如果这是一个坏标题

我有以下散列:

my %map = (
    'key1', 'hello',
    'key2', \'there'
);
print Dumper(\%map);
输出:

$VAR1 = {
    'key2' => \'there',
    'key1' => 'hello'
};
我想打印出
'key2'
处的值。以下是我尝试过的:

print "$map{key2}" => SCALAR(0x2398b08)
print "$$map{key2}" =>
print "$map->{key2}" =>
我的目标是:

print [some magic thing] => there

我是perl新手,所以我还不是100%清楚引用的行为以及如何取消引用。如何获取所需内容?

$map{key2}
返回所需元素的值。元素是对字符串的引用。[1]如果要打印该引用引用所引用的字符串,则需要取消引用它

say ${ $map{key2} };
参考资料:


  • 我怀疑这是故意的!这肯定表明某个地方有错误

  • $map{key2}
    是对标量值的引用
    \'there'
    ,因此需要取消对它的引用

    您的
    $$map{key2}
    $map->{key2}
    都将
    $map
    视为对哈希的引用,但它甚至不存在,因此这是错误的

    必须使用大括号来消除求值顺序的歧义

    ${ $map{key2} }
    
    这就是你想要的。或者你可以分两步写

    my $val = $map{key2};
    print $$val, "\n";
    

    我想在我的所有perl脚本中添加以下行:
    使用严格
    这将避免变量范围的问题。它确实要求您将所有变量的范围限定为至少“my”

    下面将允许您直接打印(与“key2”关联的散列的)值,
    没有先将其复制到另一个变量的中间步骤


    print${$map{'key2'}},“\n”

    您可以使用
    ref
    来测试它是否是引用,在这种情况下,大括号的作用类似于括号,以指示操作顺序,对吗?换句话说,双美元
    $$
    通常是取消引用变量的正确方法,但由于它是一个散列,因此顺序不明确,因此perl取消引用了错误的内容。@ewok:我不应该使用模糊
    $$map{key2}
    被定义为
    ${$map}{key2}
    ,因此它使用
    $map
    作为散列引用。事实上,这不是你想要的,这并不意味着它是“错误的”。欢迎来到StackOverflow,谢谢你的帮助。你测试你的答案了吗?我认为您可能没有注意到“key2”的值是一个引用。您的代码适用于“key1”,但需要对“key2”进行另一次修改。很好的理解,我发现了我的测试代码不正确的地方。我的%map定义中有以下内容:
    'key2','\'there'
    我修正了这一点,并适当地更新了我的答案!