0

当脚本在结果文本文件中打印整行文本文件时出现问题:

use strict;
use warnings;
use autodie;
my $out = "result2.txt";
open my $outFile, ">$out" or die $!;
my %permitted = do {
open my $fh, '<', 'f1.txt';
map { /(.+?)\s+\(/, 1 } <$fh>;
};

open my $fh, '<', 'f2.txt';
while (<$fh>) {
my ($phrase) = /(.+?)\s+->/;

if ($permitted{$phrase}) { 
print $outFile $fh;
 }
close $outFile;

问题出在这一行

print $outFile $fh;

请问有什么想法吗?

谢谢

4

3 回答 3

2

print $outFile $fh正在将文件句柄$fh的值打印到文件句柄$outFile。相反,您想打印整个当前行,即$_.

还有一些其他的改进可以做

  • 您应该始终使用 的三参数形式open,因此打开模式作为第二个参数单独出现

  • 没有必要测试一个的open成功autodie与否

  • 如果你有一个包含输出文件名的变量,那么你真的应该有两个输入文件名的变量

这就是您的程序的外观。我希望它有所帮助。

use strict;
use warnings;
use autodie;

my ($in1, $in2, $out) = qw/ f1.txt f2.txt result2.txt /;

my %permitted = do {
  open my $fh, '<', $in1;
  map { /(.+?)\s+\(/, 1 } <$fh>;
};

open my $fh,    '<', $in2;
open my $outfh, '>', $out;

while (<$fh>) {
  my ($phrase) = /(.+?)\s+->/;
  if ($permitted{$phrase}) {
    print $outfh $_;
  }
}

close $outfh;
于 2013-09-21T16:58:30.243 回答
0

我想你想要print $outfile $phrase这里,不是吗?您当前拥有的行正在尝试将文件句柄引用 ( $fh) 打印到文件 ( $outfile)。

此外,作为 perl 最佳实践的一部分,您需要将三个参数 open 用于您的第一个 open 行:

 open my $outFile, ">", $out or die $!;

(FWIW,您已经在使用 3-arg open 来调用另外两个open.)

于 2013-09-21T16:29:04.687 回答
0

尽管Borodin为您的问题提供了一个很好的解决方案,但这里有另一个选项,您可以将“in”文件的名称传递给命令行上的脚本,并让 Perl 处理这些文件的打开和关闭:

use strict;
use warnings;

my $file2 = pop;
my %permitted = map { /(.+?)\s+\(/, 1 } <>;

push @ARGV, $file2;

while (<>) {
    my ($phrase) = /(.+?)\s+->/;
    print if $permitted{$phrase};
}

用法:perl script.pl inFile1 inFile2 [>outFile]

最后一个可选参数将输出定向到文件。

pop命令从@ARGV 中隐式删除 inFile2 的名称,并将其存储在$file2. 然后,使用该指令读取 inFile1 <>。然后将 inFile2 的文件名push编辑到 @ARGV 上,读取该文件并打印一行(如果$permitted{$phrase}为真)。

在没有最后一个可选参数的情况下运行脚本会将结果(如果有)打印到屏幕上。使用最后一个参数将输出保存到文件中。

希望这可以帮助!

于 2013-09-21T20:31:46.447 回答