从Perl中的函数打印返回值

时间:2012-02-23 23:16:53

标签: 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是对类Property的调用,它返回传入的名称的值:

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

3 个答案:

答案 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在任何字符串之外。