что означают эти perl-переменные?

Я немного новичок в соглашениях о кодировании Perl, может кто-нибудь помочь объяснить:

  • почему перед переменными Perl стоят / и /<?
  • что означает \= и =~ и в чем разница?
  • почему код требует окончания / перед ;, например. /start=\'([0-9]+)\'/?

Первые три подвопроса были вроде как решены perldocs, но что означает следующая строка в коде?

push(@{$Start{$start}},$features);

Я понимаю, что мы помещаем $features в массив @Start, но что означает @$Start{$start}? Это то же самое, что: @Start = ($start);

Внутри кода есть что-то вроде этого:

use FileHandle;

sub open_infile {
  my $file = shift;
  my $in = FileHandle->new($file,"<:encoding(UTF-8)")
      or die "ERROR: cannot open $file: $!\n" if ($Opt_utf8);
  $in = new FileHandle("$file")
      or die "ERROR: cannot open $file: $!\n" if (!$Opt_utf8);
  return $in;
}

$uamf = shift @ARGV;
$uamin = open_infile($uamf);


while (<$uamin>) {
    chomp;
    if(/<segment /){
        /start=\'([0-9]+)\'/;
        /end=\'([0-9]+)\'/;
        /features=\'([^\']+)\'/;
        $features =~ s/annotation;//;

    push(@{$Start{$start}},$features); 
    push(@{$End{$end}},$features); 
    }
}

ОТРЕДАКТИРОВАНО

Итак, после некоторого интенсивного чтения документации по perl, вот что я получил

  • /<segment / — это проверка регулярного выражения, которая проверяет, содержит ли строка чтения в while (<$uamin>) следующую строку: <segment.
  • Точно так же /start=\'([0-9]+)\'/ не имеет ничего общего с созданием экземпляра какой-либо переменной, это проверка регулярного выражения, чтобы увидеть, содержит ли строка чтения в while (<$uamin>) start=\'([0-9]+)\', где \'([0-9]+)\' относится к числовой строке.
  • В $features =~ s/annotation;// используется =~, потому что замена строки проверяла соответствие регулярному выражению. См. Что делает =~ в Perl?

person alvas    schedule 21.07.2012    source источник


Ответы (1)


Где вы видели этот синтаксис (или, точнее: вы редактировали что-то из того, что видели)? /foo/ представляет оператор сопоставления с использованием регулярных выражений, а не переменных. Другими словами, первая строка проверяет, содержит ли входная строка $_ последовательность символов <segment.

Следующие три строки по существу не делают ничего полезного, в том смысле, что они выполняют сопоставление регулярных выражений, а затем отбрасывают результаты (есть побочные эффекты, но последующие регулярные выражения также отбрасывают побочные эффекты).

Последняя строка выполняет подстановку, заменяя первое появление символов annotation; пустой строкой в ​​строке $features.

Запустите команду perldoc perlretut, чтобы узнать о регулярных выражениях в Perl.

person Seth Robertson    schedule 21.07.2012
comment
я еще не редактировал код. вы, что 1-я строка проверяет, содержит ли inputstrng $_ символ ‹segment вместо ›segment? - person alvas; 22.07.2012