ответ
Это, как правило, идиома: $ х является локальным переменным присваиваются первым параметр, передаваемого в подпрограмму, хотя.
my ($x) = @_;
, вероятно, более ясный (и он не изменяет список аргументов).
Функция shift
удаляет первый элемент из массива и возвращает его. Массив укорачивается одним элементом.
Массив по умолчанию (если он не указан как параметр) равен @_
, если вы находитесь в функции, или @ARGV
, если вы находитесь в области файлов.
Таким образом, в этом случае $x
либо устанавливается на первый параметр функции, либо на первый параметр командной строки.
Если вы находитесь в подпрограмме, то эта строка будет shift
по адресу @_
(переданные параметры).
Таким образом, $x
будет первым предметом popped
от массива @_
.
Так обычно вы увидите $x = shift if @_;
shift()
является встроенным в подпрограмме Perl, который принимает массив в качестве аргумента, а затем возвращается и удаляет первый элемент в этом массиве. Общепринятой практикой является получение всех параметров, переданных в подпрограмму с помощью вызовов shift
. Например, скажем, у вас есть подпрограмма foo
, которая принимает три аргумента. Один из способов, чтобы получить эти параметры, назначенные для локальных переменных с shift
следующим образом:
sub foo() {
my $x = shift;
my $y = shift;
my $z = shift;
# do something
}
Путаница в том, что она появляется сдвиг не передается массив в качестве аргумента. Фактически, он передается массивом «default» неявно, который находится в подпрограмме @_
или @ARGV
вне подпрограммы.
В Perl многие методы используют переменные по умолчанию ($_
и @_
), если вы явно не укажете аргументы. Ваш код идентичен:
my $x = shift @_;
Как отметил PullMonkey ранее, в подпрограмме, @_
содержит аргументы, передаваемые этой подпрограммы (как описано в perlsub
). shift
удалит значение первого аргумента от @_
и сохранит его в $x
, поэтому $_[0]
теперь предоставит вам второй аргумент, переданный вашей подпрограмме.
на языке непрофессионала, с очень HighLevel зрения, сдвиг принимает первый элемент массива (крайняя левая часть), в то время как противоположная поп-, который принимает последний элемент массива (крайний правый часть).
my @array1=(5,6,7,8,9); my $x = shift @array1; print "$x\n"; # 5 print "@array1\n"; # 6 7 8 9
Не имеет значения, был ли он Googled или нет.Это отличный вопрос и определенно должен быть частью базы данных переполнения стека. – cowgod 2008-11-17 21:29:05
@friedo - Согласовано 100%! Это не должно стать сайтом «читать документы для меня». – 2008-11-18 18:34:14
`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