Потому что
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