shift()
созданный в подпрограмме Perl, которая берет массив в качестве аргумента, затем возвращает и удаляет первый объект в том массиве. Это - обычная практика для получения всех параметров, переданных в подпрограмму с shift
вызовы. Например, скажите, что у Вас есть подпрограмма foo
, который берет три аргумента. Один способ присвоить эти параметры локальным переменным с shift
как так:
sub foo() {
my $x = shift;
my $y = shift;
my $z = shift;
# do something
}
беспорядок здесь состоит в том, что кажется, что сдвиг не передается массив как аргумент. На самом деле это передается массив "по умолчанию" неявно, который является @_
внутренняя часть подпрограмма или @ARGV
внешняя сторона подпрограмма.
Эти shift
функция удаляет первый элемент из массива и возвращает его. Массив сокращен одним элементом.
массив по умолчанию (если Вам не дают в качестве параметра) @_
, если Вы находитесь в функции, или @ARGV
, если Вы в объеме файла.
Так в этом случае $x
или устанавливается на первый параметр функции, или на первый параметр командной строки.
Это обычно - идиома для: $x является локальной переменной, присвоенной первому параметру, переданному подпрограмме, хотя.
my ($x) = @_;
, вероятно, более ясно (и это не изменяет список аргументов).
на языке неспециалиста, от очень высокоуровневого представления, сдвиг берет первый элемент массива (крайняя левая часть), в то время как противоположное поп , который берет последний элемент массива (самая правая часть).
my @array1=(5,6,7,8,9); my $x = shift @array1; print "$x\n"; # 5 print "@array1\n"; # 6 7 8 9
Если Вы будете в подпрограмме, то эта строка будет shift
на @_
(параметрические усилители, которые передаются в).
Так $x
был бы первый объект popped
от эти @_
массив.
Так обычно Вы видели бы $x = shift if @_;
В Perl много методов используют переменные по умолчанию ($_
и @_
) если Вы явно не указываете аргументы. Ваш код идентичен:
my $x = shift @_;
Как указано PullMonkey ранее, в подпрограмме, @_
содержит аргументы, переданные той подпрограмме (как описано в perlsub
). shift
удалит первое значение аргумента из @_
и сохраните его в $x
, так $_[0]
теперь даст Вам, второй аргумент передал Вашей подпрограмме.