2014-10-16 1 views
4

Один из моих проектов содержит множество простых вызовов методов. Я хотел бы, чтобы назовите их без круглых скобок, чтобы избежать беспорядка и сделать частые изменения проще.вызов метода Perl без круглых скобок

Я выполнил следующие испытания.

С скобками (очевидно, работает):

my $something = [1, 2, 3]; 

my $dumper = Data::Dumper->new([$something]); 

$dumper->Indent(0); 

say $dumper->Dump(); 

Теперь без круглых скобок (работает только для методов без параметров)

my $something = [1, 2, 3]; 

# my $dumper = Data::Dumper->new [$something]; # syntax error 
my $dumper = Data::Dumper->new([$something]); 

# $dumper->Indent 0; # Number found where operator expected 
$dumper->Indent(0); 

say $dumper->Dump; # works! 

Я также протестировал косвенный синтаксис. Я знаю о его проблемах, но если это сработает, это может быть вариант. Но это не так.

sub say2 { say @_; return; } 

my $something = [1, 2, 3]; 

my $dumper = new Data::Dumper [$something]; # works! 

# Indent $dumper, 0; # No error, but doesn't do what supposed to happen 
Indent $dumper(0); # works 

# say Dump $dumper; # say() on unopened filehandle Dump 
say2 Dump $dumper; # works 

Есть ли способ вызова методов последовательно без скобок? Я не вижу реальной причины, по которой Perl не допустил бы этого, потому что нет никакой двусмысленности. Для подсетей мы используем «subs subs», возможно, что-то подобное существует для методов?

И для полноты, есть ли способ избежать «say2» в приведенном выше примере и по-прежнему звонить без круглых скобок?

Возможно, есть какие-то взломы или трюки?

ответ

4

О чем я думаю, речь здесь идет о prototyping - вы можете указать прототип подпрограммы, которая показывает, какие аргументы - и типы - это ожидание. Если вы не прототип, perl должен угадать, какие типы аргументов и как их использовать.

Это не всегда получают это право - так в вашем примере, если вы:

say Dump $dumper; 

Perl не знает, say получает ли два аргумента или один. Он должен угадать и не всегда правильно догадывается. say, в частности, на самом деле довольно сложно в том, что он может принять, потому что вы можете дать ему множество вещей для печати. Но вы можете также дать ему дескриптор файла для печати - так, как он говорит о различии через прототип.

Подпрограммы с одним аргументом, как правило, довольно очевидно, что у вас есть sub и аргумент, но все остальное потенциально двусмысленно.

Но как perldoc perlsub говорит:

«Вызовы методов не зависит от прототипов либо, потому что функция будет называться неопределенна во время компиляции, так как точный код называется зависит от наследования»

Итак, короткий ответ - вы не можете этого сделать, просто используйте круглые скобки.

+0

Прототипы не имеют значения. Суб с параметрами можно вызывать без скобок, методы не могут. Зачем? 'say' немного странно, он принимает дескриптор файла, а не запятую. 'say Dump $ dumper;' сложно, но я думаю, что 'indent $ dumper, 0;' должен работать так, как ожидалось. Тем не менее, меня не волнует косвенный синтаксис. Мой главный вопрос остается без ответа.'$ dumper-> Отступ (0);' vs '$ dumper-> Отступ 0;'. Последнее не работает. Зачем? Понятно, что это вызов метода, что еще может быть? Без параметра Perl знает, но с ним нет. Странный. Зачем? Возможно, есть возможность взломать или обмануть? – barney765