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)
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)