Я понимаю, что это старый поток, но он заставил меня задуматься о лучшем способе сдвига нескольких значений. Это все немного забавно ... В основном, это публикуется в образовательных целях.
Конечно, ($x, $y) = @_
замечательно, если вы хотите сохранить @_
, но, возможно, вы хотите изменить свои аргументы по какой-то причине? Возможно, вам нужна дополнительная функция подпрограммы, определяемая количеством оставшихся аргументов в @_
.
Самый простой способ сделать это в одну строку с простой картой
sub shiftySub {
map { $_ = shift } my ($v, $w, $x, $y);
# @_ now has up to 4 items removed
if (@_) { ... } # do stuff if arguments remain
}
- Если указано 4 аргумента,
@_
теперь пусто в подобласти.
- Если указано 5 аргументов,
@_
имеет 1 элемент, оставшийся в подобласти.
- Если указано 3 аргумента,
@_
пусто, а $y
равно undef
в подпрограмме.
Объем. * * тысяча двадцать-одна
Относительно paxdiablo теоретического оператора shift(6)
, мы можем создать нашу собственную функцию, которая выполняет эту операцию ...
sub shifter (\@;$) {
my ( $array, $n ) = ( @_, 1 );
splice( @$array, 0, $n );
}
Функция работает путем принудительного применения прототипа «передача за реф» (одна из очень ограниченных причин, по которой вы должны когда-либо использовать прототипы), чтобы гарантировать смещение массива в вызывающей области. Затем вы используете это просто так ...
my @items = ('one', 'two', 'three', 'four');
my ($x, $y) = shifter(@items, 2);
# or as a replacement for shift
my $z = shifter(@items)
# @items has 1 item remaining in this scope!
Конечно, вы также можете использовать эту функцию shifter
в других ваших сабвуферах. Основным недостатком такой функции является то, что вы должны отслеживать количество назначений по обе стороны от оператора.
Надеюсь my $post = 'informative' || 'interesting';