-4

我对 perl 编码约定有点讨厌,有人可以帮忙解释一下:

  • 为什么perl变量前面 有/and ?/<
  • 是什么意思\==~有什么区别?
  • 为什么代码需要在例如 /之前结束?;/start=\'([0-9]+)\'/

第 3 个子问题实际上是由 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 /是一个正则表达式检查,检查 readline in 是否while (<$uamin>)包含以下字符串:<segment.
  • 同样/start=\'([0-9]+)\'/,这与实例化任何变量无关,它是一个正则表达式检查,以查看 readline 中是否while (<$uamin>)包含start=\'([0-9]+)\'引用 \'([0-9]+)\'数字字符串。
  • 在is$features =~ s/annotation;//=~使用是因为字符串替换正在测试正则表达式匹配。请参阅 =~ 在 Perl 中做了什么?
4

1 回答 1

2

您在哪里看到这种语法(或者更重要的是:您是否根据您所看到的内容编辑了内容)? /foo/表示使用正则表达式的匹配运算符,而不是变量。换句话说,第一行是检查输入字符串是否$_包含字符序列<segment

接下来的三行基本上没有任何用处,因为它们运行正则表达式匹配然后丢弃结果(有副作用,但后续正则表达式也会丢弃副作用)。

最后一行进行替换,将第一次出现的字符替换annotation;为 string 中的空字符串$features

运行命令perldoc perlretut以了解 Perl 中的正则表达式。

于 2012-07-21T22:04:15.097 回答