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

Jua*_*rro 8 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;
}
Run Code Online (Sandbox Code Playgroud)

抛出以下错误

Modification of a read-only value attempted at ./bug.pl line 10.
Run Code Online (Sandbox Code Playgroud)

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

Eug*_*ash 11

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

这在以下描述perlop:

当且仅当输入符号是while语句(...)条件内的唯一内容时,该值将自动分配给全局变量$ _,从而破坏之前的任何内容.(...)$ _变量不是隐式本地化的.你必须放一个本地$ _; 在循环之前,如果你想要发生这种情况.

抛出错误,因为$_最初别名为常量值("a").

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

while (my $line = <FILE>) {
    # do something with $line
}
Run Code Online (Sandbox Code Playgroud)

  • +1似乎每天都学到一些东西.`for`在同一场景中本地化`$ _`,但由于某种原因`while`没有. (2认同)

Kus*_*nda 9

是的,while循环读取$_在该点处别名为常量(字符串"a").您应该local $_;在while循环之前使用,或者读入单独的变量.