Каковы различия между механизмами ввода параметров в Perl? - PullRequest
6 голосов
/ 17 декабря 2011

Читая загруженный модуль Perl, я нашел несколько способов определения входных параметров, которые перечислены ниже.Каковы различия между ними?

sub new{
  my $class = shift;
  my $self = {@_};
  bless{$self,  $class};
}

sub count1{
  my ($self, $lab1) = @_;
}

sub new1{
  my ($class, $lab1) = @_;
  my $self = {};
  bless $class, $self;
}

sub setpath{
  my $self = shift;
}

Ответы [ 2 ]

4 голосов
/ 17 декабря 2011

Когда вызывается подпрограмма, переданные параметры помещаются в специальный массив @_.Можно использовать этот массив, сдвигая значения my $foo = shift или путем прямого присвоения массива my ($foo,$bar)=@_; Можно даже использовать значения непосредственно из массива: $_[0]

Почему одни против других?Прямое присвоение массивов является наиболее стандартным и распространенным.Иногда способ сдвига используется, когда есть необязательные конечные значения.Прямое использование массива не рекомендуется, за исключением нескольких небольших ниш: функций-оболочек, которые вызывают другие функции, особенно внутри объектов.функции, которые обертывают другие функции и и изменяют входы.Также специальная форма goto &func, которая немедленно отбрасывает текущий стек вызовов и вызывает func с текущим значением @_.

# use shift for optional trailing values 
use v5.10;
my $foo = shift;
my $bar = shift // 'default bar value';
my $baz = shift // 'default baz value';

#obj method to call related non-object function.
sub bar { my $self = shift; _bar(@_) }
sub longname { shortname(@_) }
sub get { return $_[0]->$_[1]; }
4 голосов
/ 17 декабря 2011

# 1 и # 3 являются примерами связывания объекта с классом (объектно-ориентированный Perl).

В # 2, @_ - этосписок параметров, передаваемых в функцию, поэтому $self и $lab1 получают значения первых 2 переданных параметров.

В # 4, shift() является встроенным в PerlПодпрограмма, которая принимает массив в качестве аргумента, затем возвращает и удаляет первый элемент в этом массиве.Если он не имеет аргумента, он выполняется неявно в @_.Так $self получает значение первого переданного параметра.

...