Каковы различия между механизмами ввода параметров в 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
получает значение первого переданного параметра.