2012-02-23 77 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