2012-02-23 74 views
2

以下是如何工作的?在Perl中打印函数的返回值

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是一类财产,它返回传递的名称值的电话:

sub name { 
     my ($self, $propertyName) = @_; 
     my $hash_ref = $self->{_hashref}; 
     my %properties = %$hash_ref; 
     my $property = $properties{$propertyName}; 
     return $property; 
    } 
+0

为什么downvote? – DVK 2012-02-24 00:02:19

+0

作为一个侧面说明,你的'子名'可以简化。摆脱'%properties和$ property',直接访问hashref元素:'return $ hash_ref - > {$ propertyName};'。甚至可以摆脱'$ hash_ref'并执行'return $ self - > {_ hashref} - > {$ propertyName};' – DVK 2012-02-24 00:04:15

回答

4

因为

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

您不会轻易获得插值的函数调用retval。 – tchrist 2012-02-23 23:25:47

0

你有引号内转义引号。 NODE_HOST在任何字符串之外。

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"; 
+0

这并不奏效。你需要''foo $ {\ scalar func()} bar“或''foo @ {[func()]} bar”'。这是所有已知的技术;自开始以来一直记录在案。 – tchrist 2012-02-24 00:04:06

+0

@tchrist - Duh。实际上应该首先看到食谱;) – DVK 2012-02-24 00:53:24

+0

没有这样的东西作为列表变量。 – ikegami 2012-02-24 06:36:50