Попробуйте это:
shift qw(this that the other);
Вы получите то же сообщение об ошибке. Команда shift
должна принимать переменную списка, а не сам список. В конце концов, есть два основных аффекта с командой shift
.
- Возвращает значение первого элемента списка
- Также удаляет значение первого элемента из переменной списка. Если переменная списка отсутствует,
shift
не будет иметь никакого смысла.
В вашем примере (@interfaces = qx 'ifconfig -s')
устанавливает @interfaces
и возвращает значение списка @interfaces
, а не саму переменную в команду shift
.
Mob's ответ вам немного поможет. Вы получите ссылку на список, но затем вам придется либо разыменовать ее, либо установить фактическую переменную списка:
shift @{$interfaces = [qx'ifconfig -s']}
foreach my $entry (@{$interfaces}) { #Have to dereference
say "Interface: $entry";
}
@interfaces = @{$interfaces}; #This will also work.
Если вся цель состояла в том, чтобы сохранить некоторую типизацию, установка фактической переменной списка из ссылочной переменной разыменования ничего не спасет. И использование ссылки вместо фактического списка в остальной части вашей программы просто добавит слой сложности и запутанности.
Если вы на самом деле просто устанавливаете @interfaces
, чтобы не включать первый элемент возвращаемого списка, вы можете сделать что-то вроде этого:
(my $garbage, @interfaces) = qw(ifconfig -s);
Первое значение списка будет возвращено в $garbage
, переменную выброса. Остальная часть списка будет подмешана на @interfaces
. Это чисто и довольно легко понять, что происходит.
Эрик Стром Теперь я понял, что сделал это еще лучше:
(undef, @interfaces) = qw(ifconfig -s);
Вы даже не можете выбросить переменную.
Теперь я буду спать всю ночь, беспокоясь о том, какие изменения внес Perl 5.14 в парсинг команды shift
.