2008-11-17 7 views
64

Что может означать следующая линия?Что делает shift() в Perl?

my $x = shift; 
+32

Не имеет значения, был ли он Googled или нет.Это отличный вопрос и определенно должен быть частью базы данных переполнения стека. – cowgod 2008-11-17 21:29:05

+6

@friedo - Согласовано 100%! Это не должно стать сайтом «читать документы для меня». – 2008-11-18 18:34:14

+0

`perldoc -f shift` содержит полезную информацию от пользователя" perlfunc ". См. [Perfun] (http://perldoc.perl.org/perlfunc.html) или даже [perlfun: shift()] (http://perldoc.perl.org/functions/shift.html). Ни один из ответов не делает хорошую работу по связыванию/вытягиванию документации. Итак, «RTFM» или нет, следует включить ссылку. – 2012-01-17 04:36:18

ответ

2

Это, как правило, идиома: $ х является локальным переменным присваиваются первым параметр, передаваемого в подпрограмму, хотя.

my ($x) = @_; 

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

14

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

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

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

0

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

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

52

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

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

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

6

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

my $x = shift @_; 

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

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^