【问题标题】:How to write on different output files at each iteration of loop? (Perl)如何在每次循环迭代时写入不同的输出文件? (Perl)
【发布时间】:2015-04-01 00:25:23
【问题描述】:

我在 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 我的理解是我没有正确地告诉他他应该使用哪个文件句柄。有什么建议吗?

【问题讨论】:

  • 在你的哈希分配中,你有一个分号;,你应该有一个逗号,
  • 好收获;让我纠正一下。
  • 您不应该输入您提出问题的代码。像这样的小细节对于分析您的问题非常重要。最好是发送mcve,然后您很可能会在几分钟内得到答复。
  • 我似乎能够通过使用存储在数组中的文件句柄来复制您的问题。也许这是不可能的,尽管我可以发誓我以前见过它。您可以使用$file_handles[$index]->print("$stuff\n") 并绕过间接对象表示法。

标签: perl file-io


【解决方案1】:

除了简单的标量或文件句柄的裸字之外,您必须将文件句柄包裹在大括号中:

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

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

【讨论】:

  • 有趣:这种疯狂背后有什么逻辑吗?
  • 它让解析器知道文件句柄是什么。
【解决方案2】:

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

>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 中有关间接对象表示法的更多信息

【讨论】:

  • 哇,我刚刚完成了您关于使用间接对象表示法的建议,它完成了工作!但是,我不知道它的作用:您能向我解释一下或指向相关文档吗?非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2021-08-31
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多