Что делает shift() в Perl?

Что может означать эта линия?

my $x = shift ;

Ответ 1

shift() - встроенная подпрограмма Perl, которая принимает массив в качестве аргумента, а затем возвращает и удаляет первый элемент в этом массиве. Общепринятой практикой является получение всех параметров, передаваемых в подпрограмму с вызовами shift. Например, скажем, у вас есть подпрограмма foo, которая принимает три аргумента. Один из способов получить эти параметры, назначенные локальным переменным, равен shift следующим образом:

sub foo() {
  my $x = shift;
  my $y = shift;
  my $z = shift;
  # do something
}

Путаница здесь в том, что кажется, что сдвиг не передается массивом в качестве аргумента. Фактически, он передается массивом "по умолчанию" неявно, что является @_ внутри подпрограммы или @ARGV вне подпрограммы.

Ответ 2

Функция shift удаляет первый элемент из массива и возвращает его. Массив укорачивается одним элементом.

Массив по умолчанию (если он не указан как параметр) @_, если вы находитесь в функции, или @ARGV, если вы находитесь в области файлов.

Таким образом, в этом случае $x либо устанавливается на первый параметр функции, либо на первый параметр командной строки.

Ответ 3

В Perl многие методы используют переменные по умолчанию ($_ и @_), если явно не указать аргументы. Ваш код идентичен:

my $x = shift @_;

Как уже указывалось PullMonkey ранее, внутри подпрограммы @_ содержит аргументы, переданные этой подпрограмме (как описано в perlsub). shift удалит первое значение аргумента из @_ и сохранит его в $x, поэтому $_[0] теперь предоставит вам аргумент второй, переданный вашей подпрограмме.

Ответ 4

Обычно это идиома: $x - локальная переменная, назначенная первому параметру, переданному подпрограмме, хотя.

my ($x) = @_;

вероятно, более ясный (и он не изменяет список аргументов).

Ответ 5

Если вы находитесь в подпрограмме, эта строка будет shift на @_ (параметры, которые передаются).
Итак, $x будет первым элементом popped из массива @_.

Итак, вы обычно видите $x = shift if @_;

Ответ 6

на языке непрофессионала, с очень высокого уровня, сдвиг принимает первый элемент массива (крайняя левая часть), а противоположность - поп, который принимает последний элемент массива (самая правая часть).

my @array1=(5,6,7,8,9);
my $x = shift @array1;
print "$x\n"; # 5
print "@array1\n"; # 6 7 8 9