Каковы различия между механизмами ввода параметров в Perl?

Читая загруженный модуль 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 ответа

Решение

Когда вызывается подпрограмма, переданные параметры помещаются в специальный массив @_, Можно использовать этот массив, сдвигая значения 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]; }

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

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

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

Другие вопросы по тегам