从Perl中的函数打印返回值

eei*_*lar 2 perl

以下是如何工作的?

    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)

TLP*_*TLP 5

因为

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)