不是你想要的方式。实际上,您正在做的$snap->snapshot_id
是调用一个方法(如 中sub
)。Perl 不能在双引号字符串中做到这一点。它将插入您的变量$snap
。这变得有点像HASH(0x1234567)
,因为它就是这样:bless
哈希的 ed 引用。
插值仅适用于标量(和数组,但我将省略)。你可以走了:
print "$foo $bar"; # scalar
print "$hash->{key}"; # scalar inside a hashref
print "$hash->{key}->{moreKeys}->[0]"; # scalar in an array ref in a hashref...
不过,有一种方法可以做到这一点:您可以在带引号的字符串中引用和取消引用它,就像我在这里所做的那样:
use DateTime;
my $dt = DateTime->now();
print "${\$dt->epoch }"; # both these
print "@{[$dt->epoch]}"; # examples work
但这看起来相当难看,所以我不推荐它。请改用您的第一种方法!
如果您仍然对它的工作原理感兴趣,您可能还想查看这些 Perl 常见问题解答:
从perlref:
这是将子例程调用插入字符串的技巧:
print "My sub returned @{[mysub(1,2,3)]} that time.\n";
它的工作方式是,当在双引号字符串中看到 @{...} 时,它被评估为一个块。该块创建对包含调用结果的匿名数组的引用 mysub(1,2,3) 。所以整个块返回一个对数组的引用,然后由 @{...} 取消引用并卡在双引号字符串中。这种诡计对于任意表达也很有用:
print "That yields @{[$n + 5]} widgets\n";
同样,返回标量引用的表达式可以通过 ${...} 取消引用。因此,上面的表达式可以写成:
print "That yields ${\($n + 5)} widgets\n";