2013-12-23 2 views
1
my @writers = qw(Horace Ovid Virgil Asimov Heinlein Dante); 
my @contemporary = splice @writers, 3, 2; 
print join(' ', @contemporary); 

выходсращивания в PERL скрипт

Asimov Heinlein 

 


my @writers = qw(Horace Ovid Virgil Asimov Heinlein Dante); 
splice @writers, 3, 2; 
print join(' ', @writers); # Horace Ovid Virgil Dante 

выход

Horace Ovid Virgil Dante 

В чем разница между этими сценариями. Почему он показывает разные результаты?

+3

Потому что в первом случае вы печатаете возвращаемое значение 'splice', а во втором случае вы видите, что эффект' splice' имел на массиве '@ writers'. У вас нет причин ожидать, что они должны быть одинаковыми, и вы ожидаете, что это неправильно. – Borodin

ответ

1

здесь

my @contemporary = splice @writers, 3, 2; 
print join(' ', @contemporary); 

возвращает те элементы, которые были удалены

а здесь

splice @writers,3,2; 
print join(' ', @writers) 

это просто напечатать элементы массива

и в скалярном контексте например

my $contemporary = splice @writers, 3, 2; 
print $contemporary; 

он будет печатать последний элемент, который был удален

из perldoc

Удаляет элементы, обозначенные OFFSET и LENGTH из массива, и заменяет их с элементами LIST, если таковые имеются , В контексте списка возвращает элементы, удаленные из массива. В скалярном контексте возвращает последний удаленный элемент или undef, если элементы не удалены. Массив растет или сжимается по мере необходимости. Если OFFSET отрицательный, то он начинается так далеко от конца массива. Если LENGTH опущен, удаляет все из OFFSET вперед. Если LENGTH отрицательна, удаляет элементы из OFFSET вперед, за исключением элементов -LENGTH в конце массива. Если оба параметра OFFSET и LENGTH опущены, удаляются все. Если OFFSET находится за концом массива, Perl выдает предупреждение и сращивается в конце массива.

+0

Не могли бы вы объяснить, почему это так? – user3114045

+2

Это ведет себя так, потому что разработчики функции думали, что это будет самое полезное поведение. И я не понимаю, почему вы не согласны. Что бы вы ожидали увидеть? –

+1

@ user3114045: Это совершенно другой вопрос и должен быть опубликован как таковой. (И вы не должны пытаться ответить на него здесь Muhiwara.) – Borodin

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