Хранение массива как значения в ассоциативном массиве - PullRequest
1 голос
/ 11 мая 2010

У меня проблема, когда мне нужно иметь массив в качестве значения в ассоциативном массиве.

Пройдите через код ниже. Здесь я пытаюсь зациклить файлы в каталоге, и более вероятно, что более 1 файла могут иметь одинаковые ctrno. Итак, я хотел бы посмотреть, что все файлы имеют одинаковые ctrno. Приведенный ниже код выдает ошибку в «$ctrno_hash[$ctrno] = @arr;» в другом состоянии. То же самое относится и к условию if.

Я придерживаюсь правильного подхода или это может быть сделано по-другому?

sub loop_through_files
{
    $file = "@_";
    open(INPFILE, "$file") or die $!;
    #print "$file:$ctrno\n";
    while (<INPFILE>)
    {
       $line .= $_;
    }
    if ($line =~ /$ctrno/ )
    {
       print "found\n";
       if ( exists $ctrno_hash[$ctrno])
       {
          local @arr = $ctrno_hash[$ctrno];
          push (@arr, $file);
          $ctrno_hash[$ctrno] =  @arr;
       }
       else
       {
          local @arr;
          push(@arr, $file);
          $ctrno_hash[$ctrno] =  @arr;
       }
    }
}

1 Ответ

5 голосов
/ 11 мая 2010

Я полагаю, вы хотите что-то вроде

$ctrno_hash[$ctrno] =  \@arr;

Это превратит массив @arr в array reference.

Затем вы ссылаетесь на ранее выдвинутую ссылку на массив с

@{$ctrno_hash[$ctrno]}

То есть, если $array_ref является ссылкой на массив, конструкция @{ $array_ref } возвращает массив, на который указывает ссылка на массив.

Теперь конструкция $ctrno_hash[$ctrno] на самом деле не хеш, а обычный массив. Чтобы по-настоящему сделать его хешем, вам нужны фигурные скобки вместо квадратных скобок:

@{$ctrno_hash{$ctrno} } = \@arr;

И, аналогично, вы позже обратитесь к массиву с

@{$ctrno_hash{$ctrno} }

Теперь, сказав это, вы можете отказаться от конструкции if ... exists:

if ($line =~ /$ctrno/ )
{
   print "found\n";
   push @{$ctrno_hash{$ctrno}}, $file
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...