$ _的范围:为什么会改变它?

时间:2014-05-12 14:28:28

标签: perl scope

我有一个如下代码段:

use strict;
use warnings;

# file names to search for
open(my $files,  "<",  "fileList.txt") or die "Can't open fileList.txt: $!";

my $flag = 0;
while (<$files>) {
    print "File loop: $_\n";

    open(my $search,  "<",  "searchMe.txt") or die "Can't open searchMe.txt: $!";

    $flag = 0;
    while (<$search>){
        print "Search loop: $_\n";
    }
}

fileList.txt包含一行:&#34; CheckFilesFunctions.pm&#34;

searchMe.txt包含一行:abc

这里的输出是

File loop: CheckFilesFunctions.pm
Search loop: abc

然而。当我将搜索循环更改为以下

while (<$search> && !$flag){

突然搜索循环开始打印

Search loop: CheckFilesFunctions.pm

为什么$ _的范围会在这里改变?

1 个答案:

答案 0 :(得分:6)

while (<filehandle>)while (defined( $_ = <filehandle> ))的便捷简写;如果你有一个更复杂的表达式来测试,你需要明确包含完整的东西:

while ( defined( $_ = <$search> ) && ! $flag ) {

虽然我建议明确使用readline<>可以表示readlineglob,具体取决于参数;我更喜欢直接使用这些参数并使用词汇变量:

while ( defined( my $line = readline $search ) && ! $flag ) {

或者,您可以突破循环而不是修改条件:

while (<$search>) {
    ...
    if (...) {
        last;

虽然查看了你的代码,但你可能希望在文件循环之前只将一次搜索文件读入数组,然后循环遍历该数组。