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

64

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

my $x = shift ;
  • 0
    Perl имеет встроенные документы для каждой стандартной функции. Они также онлайн. В данном случае « perldoc -f shift ».
  • 34
    Неважно, гуглил он это или нет. Это отличный вопрос, и он обязательно должен быть частью базы данных Stack Overflow.
Показать ещё 2 комментария
Теги:
builtin

6 ответов

50

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

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

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

  • 0
    или @ARGV, если вы не в функции (см. мой ответ)
  • 1
    Вы не хотите '()' после имени подпрограммы - это должно быть 'sub foo {...'. С помощью '()' вы говорите, что foo не принимает аргументов, что в данном случае не то, что вы хотите
Показать ещё 1 комментарий
14

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

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

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

  • 7
    Следует добавить, что @_ - это массив, содержащий параметры, заданные для функции, а @ARGV - это массив, содержащий параметры, переданные программе.
6

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

my $x = shift @_;

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

2

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

my ($x) = @_;

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

0

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

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

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

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

  • 2
    Нет реальной необходимости, если. "мой $ х = смещение;" и "мой $ x; $ x = сдвиг, если @_;" эквивалентны и оба приведут к тому, что $ x будет undef, если @_ пусто, и не нарушит строгое правило или не выдаст предупреждение. Единственная разница - количество набираемого текста.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню