$ /和本地$ /的区别

Kam*_*ūtė 2 variables perl global-variables temp

对于我的程序,我需要使用FASTA文件并对其进行一些计算。为了做到这一点,我使用local $/ = "^>来将我的文件切成标题行和序列行。虽然我的程序可以执行我想要的操作,但为什么我不能仅仅使用它$/ = "^>"呢?当我尝试它时,我的结果不是我所需要的,我很感兴趣为什么会这样。这是我的简化代码:

my @array;
while(<>){
    local $/ = "^>";
    chomp;
    push (@array, $_);
    if(eof){
        for(@array){
            ...
        }
    ...
    }
    if(eof){
        @array = ();
    }
Run Code Online (Sandbox Code Playgroud)

zdi*_*dim 5

本地

将列出的变量修改为对于封闭的块,文件或eval是局部的。

它节省了(已经存在的)变量的值,可以根据需要对其进行更改,并且一旦退出作用域,仍将恢复其原始值。

因此,它可以精确地与全局变量一起使用,例如$/-通过local对它们进行大小调整,我们可以在需要的范围内更改其值,而不会在整个程序中对其进行更改。

perlsub中提供更多内容。

显示的内容虽然引起了疑问。的$/变量需要一个字符串,而不是正则表达式; 我记得那些“ fasta”文件的行以开头>,而不是^>。另外,$/需要在读取行(带有<>)之前进行设置,但我看不到所示代码如何实现其意图。


ike*_*ami 5

local $var保存的值$var,并向堆栈中添加一个指令,$var当退出作用域时(即使是例外),该指令将导致恢复值。my封装变量是最接近的方法。

$_ = 123;
{
   local $_ = 456;
   # $_ is 456 here.
}
# $_ is back to being 123 here.
Run Code Online (Sandbox Code Playgroud)

这对于避免在周围的代码或调用者中引起问题(对于subs)很有用。

请注意,的值$/是按字符匹配的。它不被视为正则表达式。

请注意,$/您发布的代码中似乎没有任何设置(除非您遗漏了一些内容)。


为什么我不能简单地使用 $/ = "^>"

然后,变化不会撤消在块的结束,所以它会影响<>while状况以及你的循环执行读取之后的任何代码。


我如何处理FASTA文件:

my ($header, $seq);
while (1) {
   my $line = <>;
   if (!defined($line) || $line =~ /^>/) {
      work($header, $seq) if defined($header);

      last if !defined($line);

      chomp($line);
      $header = substr($line, 1);
      $seq = "";
   } else {
      chomp($line);
      $seq .= $line;
   }
}
Run Code Online (Sandbox Code Playgroud)