Что такое отправка в хэш и конструкция || = []. (сгенерировано в файле cabinplate.t)

Я заново знакомлюсь с Perl и только что использовал module-starter для инициализации нового проекта. Сейчас я пытаюсь понять сгенерированный код. Все в порядке, за исключением следующей указанной строки:

sub not_in_file_ok {
  my ($filename, %regex) = @_;
  open( my $fh, '<', $filename )
    or die "couldn't open $filename for reading: $!";

  my %violated;

  while (my $line = <$fh>) {
    while (my ($desc, $regex) = each %regex) {
        if ($line =~ $regex) {
            ##I'm having problems here
            push @{$violated{$desc}||=[]}, $.;
        }
    }
  }
  ...
}

У меня две проблемы:

  1. || = [] . Это | , за которым следует | = , или это или || , за которым следует = [] . Может ли кто-нибудь рассказать мне, что здесь происходит? (Я предполагаю, что «если хеш пуст, создайте пустой анонимный массив для инициализации хеша», но мне сложно понять, как он формируется из кода.)
  2. push @ {$ violated {$ desc }}, $. Я понимаю, что это означает «присвоить номер строки ключу $ desc для хеша %, нарушенного . Но из прочитанного мной кода» найдите значение ключа desc из $ нарушено {$ desc} (часть $ нарушено {$ desc} ), затем используйте это значение как символическую ссылку на массив ( @ {$ value} part), затем вставьте номер строки в этот массив ". Я не понимаю, как согласовать эти два представления.

Я думаю, мне есть чему поучиться в этой строке кода - может ли кто-нибудь помочь мне, объяснив это?

6
задан GEOCHET 21 November 2011 в 23:03
поделиться