使用隐式$ _变量在while循环上“修改只读值”

时间:2011-10-12 11:51:40

标签: perl

我真的不明白为什么以下的perl代码

#!/usr/bin/perl -w

use strict;
use warnings;

strange($_) for qw(a b c);

sub strange {
  open FILE, '<', 'some_file.txt' or die;
  while (<FILE>) { } # this is line 10
  close FILE;
}

抛出以下错误

Modification of a read-only value attempted at ./bug.pl line 10.

这是一个错误吗?或者我应该知道魔术/隐式变量$_的用法?

2 个答案:

答案 0 :(得分:11)

while (<fh>)构造隐式赋值给全局变量$_

perlop

中对此进行了描述
  

当且仅当输入符号是唯一的内容时   以while语句(...)为条件,该值是自动的   分配给全局变量$ _,摧毁那里的任何东西   先前。 (...)$ _变量不是隐式本地化的。你会   必须放一个本地$ _;如果你希望这种情况发生在循环之前。

抛出错误是因为$_最初被别名为常量值("a")。

您可以通过声明词法变量来避免这种情况:

while (my $line = <FILE>) {
    # do something with $line
}

答案 1 :(得分:9)

是的,while循环读入$_,此时该别名为常量(字符串“a”)。您应该在while循环之前使用local $_;,或者读入单独的变量。