проблемы в сегменте кода Perl - PullRequest
2 голосов
/ 13 декабря 2011

Я начинаю изучать Perl, и у меня есть вопросы по следующему сегменту кода Perl.

Я знаю, что «my» используется для определения локальной переменной, а «shift» используется для получения головыэлемент из массива.Меня смутило то, откуда берется массив в следующем фрагменте кода.

Кроме того, что означает my @positives = keys %{$lab1->{$cate1}}

preData($cate1, $lab1)

sub preData
{
  my $cate1 = shift;
  my $lab1 = shift;

  my @positives = keys %{$lab1->{$cate1}};
}

Ответы [ 3 ]

5 голосов
/ 13 декабря 2011

$lab1 - это хеш-ссылка, содержащая другие хеш-ссылки.$cate1 - это какой-то ключ категории (я предполагаю).

$lab1->{$cate1} - ссылка на хеш.Когда вы разыменовываете его, помещая вокруг него * 1006, вы получаете хеш обратно.Затем этот хэш передается в функцию keys(), которая возвращает список ключей в этом хэше.Таким образом, @positives является массивом ключей в хэше, на которые ссылается ссылка на хэш $lab1->{$cate1}.

Редактировать: При работе с этими видами вложенных структур вам может оказаться прощечтобы понять, что происходит, увидев представление данных.В верхней части вашего сценария добавьте use Data::Dumper.Затем между строками my $lab1... и my @positives... добавьте:

print Dumper($lab1);
print Dumper($lab1->{$cate1});

И после установки массива @positives добавьте:

print Dumper(\@positives);

Это должно помочь вам лучшевизуализируйте данные и, надеюсь, получите лучшее понимание структур Perl.

2 голосов
/ 13 декабря 2011

@ обозначает массив, а% обозначает хеш. Итак, это утверждение:

my @x = keys %y;

Значит взять список ключей из хеша y и присвоить их массиву x. То есть, если% y:

one => 1,
two => 2,
three => 3

Тогда @x будет содержать:

one, two, three
2 голосов
/ 13 декабря 2011

Когда вы вызываете подпрограмму в Perl, аргументы этой подпрограммы передаются ей в массиве @_.Вызов shift без каких-либо параметров будет принимать аргументы из массива @_.Таким образом, этот код переводит $ cate1 из первого параметра в preData и $ lab1 из второго параметра в preData.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...