以下是如何工作的?
print "Property is :" . $property->name("NODE_HOST") . "\n";
Run Code Online (Sandbox Code Playgroud)
但不是这个:
print "Property is : $property->$name("NODE_HOST")\n";
Run Code Online (Sandbox Code Playgroud)
编译器抱怨第二个片段:
Bareword found where operator expected at ./testProperties.pl line 11, near ""Property is : $property->$name("NODE_HOST"
(Missing operator before NODE_HOST?)
Run Code Online (Sandbox Code Playgroud)
在打印出字符串和变量的组合时,Perl通常很容易获取快捷方式.$property->name是对类Property的调用,它返回传入的名称的值:
sub name {
my ( $self, $propertyName ) = @_;
my $hash_ref = $self->{_hashref};
my %properties = %$hash_ref;
my $property = $properties{$propertyName};
return $property;
}
Run Code Online (Sandbox Code Playgroud)
因为
print "Property is :" . $property->name("NODE_HOST") . "\n";
Run Code Online (Sandbox Code Playgroud)
适当引用,而:
print "Property is : $property->$name("NODE_HOST")\n";
Run Code Online (Sandbox Code Playgroud)
不是.它的意思是:
print "Property is : $property->$name("
NODE_HOST
")\n";
Run Code Online (Sandbox Code Playgroud)
这是一个荒谬的陈述.
当您使用 "开始报价时,任何以下"表示报价结束.您不能指望perl理解非转义双引号不是作为引用的结尾.
你的意思是
print "Property is : $property->$name(\"NODE_HOST\")\n";
Run Code Online (Sandbox Code Playgroud)
但那不符合你的期望.
我假设在这里尝试插值的原因是保持打开和关闭引号是很尴尬的.你有一些选择:
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");
Run Code Online (Sandbox Code Playgroud)
或者,如果您有要打印的语句列表,最简单的方法是将它们存储在数组中,然后打印它们,例如:
push @props, "Property#1 is: " . $property->name("NODE_HOST");
push @props, "Property#2 is: " . $property->name("FOO");
...
say for @props; # print them all
Run Code Online (Sandbox Code Playgroud)