Печать возвращаемого значения из функции в Perl - PullRequest
2 голосов
/ 24 февраля 2012

Как получается, что следующие работы?

    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 ]

5 голосов
/ 24 февраля 2012

Потому что

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
2 голосов
/ 24 февраля 2012

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 голосов
/ 24 февраля 2012

В кавычках есть неэкранированные кавычки.NODE_HOST находится вне какой-либо строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...