2012-05-02 4 views
3

Это весь сценарий, что для каких-то таинственных мне почему-выходов «642»

#!usr/bin/perl 
%vvv = (1,2,3,4,5,6); 
$#vvv--; 
%vvv = reverse %vvv; 
print keys %vvv, "\n"; 

И что же «ключи» в последнем заявлении делать? Спасибо за ваше время. Я просто тороплюсь, что у меня нет времени для проведения моих исследований. Поэтому снова я ценю ваш вклад.

ответ

6

$ # vvv-- выглядит как комментарий. То, что происходит, это хеш, являющийся четным массивом элементов, просто обратным. Так идет от:

%vvv = (
    1 => 2, 
    3 => 4, 
    5 => 6 
); 

к:

%vvv = (
    6 => 5, 
    4 => 3, 
    2 => 1 
); 

Так, когда ключи будут напечатаны, он хватает 642, или новые, текущие ключи хэша.

+7

'$ # vvv' - это не комментарий, но он не оказывает никакого влияния и на хэш. –

+0

Спасибо вам и Синан за исправление. Я увидел # и сразу подумал о комментариях. Виноват! – MadFriarAvelyn

+1

Спасибо за ваш ответ. Действительно, я просто удалил строку, подобную комментарию, и получил тот же результат. Тем не менее, существует очень похожая проблема с массивами, и там, когда я удалял одну и ту же строку, я получил разный вывод. Вот код .. '#! Usr/bin/perl @vvv = (1,2,3,4,5,6,7); $ # vvv--; print $ vvv [$ # vvv], "\ n"; ' – boogie

20

Вы всегда должны запускать сценарии с

use strict; 
use warnings; 

Если вы были, вы бы заметили ошибку:

Global symbol "@vvv" requires explicit package name at ... 

Это означает, что $#vvv относится к максимальному индексу массива @vvv, а не хэш. В perl @vvv и %vvv представляют собой две отдельные переменные. Таким образом, @vvv не имеет никакого отношения к %vvv, и эта операция не используется.

Что человек, который написал код, возможно, думал о способе усечь массив:

my @array = 1 .. 6; # 1,2,3,4,5,6 but written as a range 
$#array--;   # lower maximum index by 1 
print "@array";  # prints "1 2 3 4 5" 

Однако, это не работают желания хэш.

И, как пояснил Фрайар, reverse - это способ обмена ключами и значениями хэша. При использовании в строке он меняет строку, например. «foobar» -> «raboof», но при использовании в списке он меняет его, поэтому 1,2,3,4,5,6 становится 6,5,4,3,2,1.

+0

Это было очень полезно, спасибо. – boogie

+0

@ManzarshohDilovar Добро пожаловать. – TLP