Что может означать эта линия?
my $x = shift ;
Что может означать эта линия?
my $x = shift ;
shift()
- встроенная подпрограмма Perl, которая принимает массив в качестве аргумента, а затем возвращает и удаляет первый элемент в этом массиве. Общепринятой практикой является получение всех параметров, передаваемых в подпрограмму с вызовами shift
. Например, скажем, у вас есть подпрограмма foo
, которая принимает три аргумента. Один из способов получить эти параметры, назначенные локальным переменным, равен shift
следующим образом:
sub foo() {
my $x = shift;
my $y = shift;
my $z = shift;
# do something
}
Путаница здесь в том, что кажется, что сдвиг не передается массивом в качестве аргумента. Фактически, он передается массивом "по умолчанию" неявно, что является @_
внутри подпрограммы или @ARGV
вне подпрограммы.
Функция shift
удаляет первый элемент из массива и возвращает его. Массив укорачивается одним элементом.
Массив по умолчанию (если он не указан как параметр) @_
, если вы находитесь в функции, или @ARGV
, если вы находитесь в области файлов.
Таким образом, в этом случае $x
либо устанавливается на первый параметр функции, либо на первый параметр командной строки.
В Perl многие методы используют переменные по умолчанию ($_
и @_
), если явно не указать аргументы. Ваш код идентичен:
my $x = shift @_;
Как уже указывалось PullMonkey ранее, внутри подпрограммы @_
содержит аргументы, переданные этой подпрограмме (как описано в perlsub
). shift
удалит первое значение аргумента из @_
и сохранит его в $x
, поэтому $_[0]
теперь предоставит вам аргумент второй, переданный вашей подпрограмме.
Обычно это идиома: $x - локальная переменная, назначенная первому параметру, переданному подпрограмме, хотя.
my ($x) = @_;
вероятно, более ясный (и он не изменяет список аргументов).
Если вы находитесь в подпрограмме, эта строка будет shift
на @_
(параметры, которые передаются).
Итак, $x
будет первым элементом popped
из массива @_
.
Итак, вы обычно видите $x = shift if @_;
на языке непрофессионала, с очень высокого уровня, сдвиг принимает первый элемент массива (крайняя левая часть), а противоположность - поп, который принимает последний элемент массива (самая правая часть).
my @array1=(5,6,7,8,9); my $x = shift @array1; print "$x\n"; # 5 print "@array1\n"; # 6 7 8 9