некоторые вопросы по Perl-программе - PullRequest
3 голосов
/ 13 февраля 2012

Что касается следующего сегмента кода, я хотел бы знать, правильное ли мое понимание по нескольким вопросам?

1) В структуре $model->{in1}->{tra1}->{data}} «in1», «tra1» и «data» представляют конкретные ключи на разных уровнях хеш-структур.

2) $#{$model->{in1}->{tra1}->{data}} представляет массив?

3) На что направлен мой @cus = sort keys %cus;? Являются ли «cus» на правой стороне и «cus» на левой стороне одинаковыми?

my %cus = ();
for my $i ( 0 .. $#{$model->{in1}->{tra1}->{data}})
{
  foreach  my $cu (keys %{$model->{in1}->{tra1}->{data}->[$i]->{concept}}
   {
       $cus{$cu} = 1;
   }
 }
my  @cus = sort keys %cus;

Ответы [ 3 ]

5 голосов
/ 13 февраля 2012

1)

Это ключи к разным хэшам, да.

  • in1 используется как ключ к хешу, на который ссылается $model.
  • tra1 используется как ключ к хешу, на который ссылается $model->{in1}.
  • data используется как ключ к хешу, на который ссылается $model->{in1}->{tra1}.

2)

  • $#a возвращает последний индекс массива @a.

так

  • $#{ $ref } (или $#$ref для краткости) возвращает последний индекс @{ $ref } (или @$ref для краткости), массив, на который ссылается $ref.

так

  • $#{ $model->{in1}->{tra1}->{data} } возвращает последний индекс @{ $model->{in1}->{tra1}->{data} }, массив, на который ссылается $model->{in1}->{tra1}->{data}.

3)

Оператор сортирует ключи хэша %cus и помещает их в массив @cus. Нет, %cus и @cus не являются одной и той же переменной.

"4")

Код можно упростить до:

my %cus;
my $data = $model->{in1}->{tra1}->{data};
for my $i (0 .. $#$data) {
   for my $cu (keys %{ $data->[$i]->{concept} }) {
      ++$cus{$cu};
   }
}

my @cus = sort keys %cus;

Или даже:

my %cus;
for my $data_item (@{ $model->{in1}->{tra1}->{data} }) {
   for my $cu (keys %{ $data_item->{concept} }) {
      ++$cus{$cu};
   }
}

my @cus = sort keys %cus;
0 голосов
/ 13 февраля 2012

В структуре $model->{in1}->{tra1}->{data}} «in1», «tra1» и «data» представляют конкретные ключи на разных уровнях хеш-структур.

Да. Если это не так, возникнет ошибка.

Представляет ли $#($model->{in1}->{tra1}->{data}} массив?

Не совсем. Это количество элементов в массиве (поэтому, да, данные в хэше должны быть массивом).

Что мой @cus = sort keys %cus; стремится сделать?

Он берет все ключи из хеш-таблицы %cus и сортирует их по алфавиту в новый массив @cus.

Являются ли "cus" на правой стороне и "cus" на левой стороне одним и тем же?

Нет. В Perl $cus, @cus и %cus - это три разные переменные. Префикс обозначает тип.

0 голосов
/ 13 февраля 2012
  1. Да, у вас есть три вложенных хэша.

  2. Да, часть $#{...} означает «самый большой индекс вложенного массива». Вы также знаете, что ...->{data} - это (ссылка на) массив из-за ->{data}->[$i] на следующей строке.

  3. @cus и %cus - две разные переменные, не связанные между собой.

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