以下如何运作?
print "Property is :" . $property->name("NODE_HOST") . "\n";
但不是这样:
print "Property is : $property->$name("NODE_HOST")\n";
编译器抱怨第二个片段:
Bareword found where operator expected at ./testProperties.pl line 11, near ""Property is : $property->$name("NODE_HOST"
(Missing operator before NODE_HOST?)
在打印字符串和变量的组合时,Perl通常很容易获取快捷方式。 $property->name
是对类Property的调用,它返回传入的名称的值:
sub name {
my ( $self, $propertyName ) = @_;
my $hash_ref = $self->{_hashref};
my %properties = %$hash_ref;
my $property = $properties{$propertyName};
return $property;
}
答案 0 :(得分:5)
因为
print "Property is :" . $property->name("NODE_HOST") . "\n";
被正确引用,而:
print "Property is : $property->$name("NODE_HOST")\n";
不是。这意味着:
print "Property is : $property->$name("
NODE_HOST
")\n";
这是一个荒谬的陈述。
当您使用"
开始报价时,以下任何"
表示报价结束。您不能指望perl理解非转义双引号不是作为引用的结尾。
你的意思是
print "Property is : $property->$name(\"NODE_HOST\")\n";
但那不符合你的期望。
我认为在这里尝试插值的原因是保持打开和关闭引号很难。你有一些选择:
printf "Property is: %s\n", $property->name("NODE_HOST");
$name = $property->name("NODE_HOST");
print "Property is: $name\n";
use v5.10; # to enable say()
say "Property is: ", $property->name("NODE_HOST");
或者如果你有一个要打印的语句列表,最简单的方法是将它们存储在一个数组中,然后打印它们,例如:
push @props, "Property#1 is: " . $property->name("NODE_HOST");
push @props, "Property#2 is: " . $property->name("FOO");
...
say for @props; # print them all
答案 1 :(得分:2)
Perl不会在""
中插入子程序调用。它只能插入标量和数组变量。您可以在perldoc perlop
上阅读插值规则的血腥细节。
然而,你可以做一个标量表达式:
print "Property is : ${ \( $property->name('NODE_HOST') ) }\n";
然而,说实话,这是非常不可读的,我会建议强烈反对它。只是做无聊:
my $property_name = $property->name('NODE_HOST');
print "Property is : $property_name\n";
# or
print "Property is :" . $property->name("NODE_HOST") . "\n";
答案 2 :(得分:0)
你的引号内有未转义的引号。 NODE_HOST
在任何字符串之外。