这些perl变量是什么意思?

时间:2012-07-21 21:58:06

标签: perl variables coding-style string-matching slash

对于perl编码惯例,我有点不感兴趣,有人可以帮忙解释一下:

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

前3个子问题实际上是由perldoc解决的,但是代码中的以下行是什么意思?

push(@{$Start{$start}},$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); 
    }
}

EDITED

所以在对perl doc进行了一些深入阅读之后,这里有一些我已经得到的东西

  • /<segment /是一个正则表达式检查,用于检查是否为readline while (<$uamin>)中包含以下字符串:<segment
  • 同样地,/start=\'([0-9]+)\'/与此无关 实例化任何变量,它是一个正则表达式检查,看看是否 while (<$uamin>)中的readline包含start=\'([0-9]+)\' \'([0-9]+)\'指的是数字字符串。
  • $features =~ s/annotation;//中使用=~因为字符串 替换正在测试正则表达式匹配。看到 What does =~ do in Perl?

1 个答案:

答案 0 :(得分:2)

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

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

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

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