如何在循环的每次迭代中写入不同的输出文件? (Perl的)

时间:2015-04-01 00:25:23

标签: perl file-io

我在Perl中有一个散列哈希值哈希,名为data,带有第一级密钥:F,NF和S(基本上是%data={'F' => ..., 'NF' => ..., 'S' => ...}

在我的代码的开头,我打开3个输出句柄:

open (my $fh1, ">>", $filename1) or die "cannot open > $filename1: $!";
open (my $fh2, ">>", $filename2) or die "cannot open > $filename2: $!";
open (my $fh3, ">>", $filename3) or die "cannot open > $filename3: $!";

然后,当我的代码运行时,它会填充哈希散列的散列,最后,我想打印每个键的散列散列哈希值' F',' NF'和' S'到一个单独的文件(由我在开头定义的三个文件句柄标识。)我不确定如何做到这一点。我尝试了以下内容:在我打印哈希的foreach循环之前,我已经定义了

my @file_handles=($fh1, $fh2, $fh3);
my $handle_index=0;

在散列的每次迭代中,我使用

写入文件
print $file_handles[$handle_index] "$stuff\n";

然而,当我尝试运行代码时,它会告诉我string found where operator expected 我的理解是,我没有正确地告诉他应该使用哪个文件句柄。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

除了文件句柄的简单标量或单词之外,还必须将文件句柄包装在大括号中:

print { $file_handles[$handle_index] } "stuff to print";

请注意文件句柄部分后面仍然没有逗号。

答案 1 :(得分:0)

我似乎能够通过使用存储在数组中的文件句柄来复制您的问题。也许这是不可能的,虽然我可以发誓我曾经见过它。

>perl -lwe"open $x, '>', 'a.txt' or die $!; @x = ($x); print $x[0] 'asd';"
String found where operator expected at -e line 1, near "] 'asd'"
        (Missing operator before  'asd'?)
syntax error at -e line 1, near "] 'asd'"
Execution of -e aborted due to compilation errors.

使用哈希也是如此。可能的解决方法是:

您可以跳过间接对象表示法并使用:

$file_handles[$index]->print("$stuff\n")

或者您可以使用Perl样式的循环来打印:

for my $fh (@file_handles) {
    print $fh "$stuff\n";
}

间接对象表示法是指在函数调用之前放置对象(在您的情况下为文件句柄),如下所示:

my $obj = new Module;

而不是传统的:

my $obj = Module->new;

有关perldoc perlobj

中间接对象表示法的更多信息