Что делает shift () в Perl? - PullRequest
66 голосов
/ 18 ноября 2008

Что может означать следующая строка?

my $x = shift;

Ответы [ 6 ]

54 голосов
/ 18 ноября 2008

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

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

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

14 голосов
/ 18 ноября 2008

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

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

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

6 голосов
/ 18 ноября 2008

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

my $x = shift @_;

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

2 голосов
/ 18 ноября 2008

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

my ($x) = @_;

, вероятно, яснее (и не меняет список аргументов).

0 голосов
/ 21 ноября 2008

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

my @array1=(5,6,7,8,9);
my $x = shift @array1;
print "$x\n"; # 5
print "@array1\n"; # 6 7 8 9
0 голосов
/ 18 ноября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...