钻石操作员似乎只工作一次

时间:2017-08-03 15:53:56

标签: perl while-loop

我在Perl中编写一个脚本,我必须在代码中打开两次相同的文件。这是我的代码大纲:

#!/usr/bin/perl
use strict;
use warnings;

my %forward=();
my %reverse=();

while(<>){
    chomp;
    # store something
    }   
}

while(<>){ # open the same file again
    chomp;
    #print something
}

我正在使用菱形运算符,所以我正在运行这样的脚本

perl script.pl input.txt

但这不会产生任何输出。如果我使用文件句柄打开文件,脚本可以正常工作。这可能有什么问题?

2 个答案:

答案 0 :(得分:4)

在耗尽之前保存@ARGV。当然,这只适用于命令行中指定的实际文件,而不适用于STDIN

#!/usr/bin/env perl

use strict;
use warnings;

run(@ARGV);

sub run {
    my @argv = @_;
    first(@argv);
    second(@argv);
}

sub first {
    local @ARGV = @_;
    print "First pass: $_" while <>;
}

sub second {
    local @ARGV = @_;
    print "Second pass: $_" while <>;
}

答案 1 :(得分:3)

你在第一个循环中读到了所有要阅读的东西,在第二个循环中没有留下任何东西。

如果输入不是很大,你只需将其加载到内存中即可。

my @lines = <>;
chomp( @lines );

for (@lines) {
   ...
}

for (@lines) {
   ...
}