使用perl将结果写入文本文件

时间:2013-09-21 16:25:37

标签: perl

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

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;

请问好吗?

谢谢

3 个答案:

答案 0 :(得分:2)

print $outFile $fh正在将文件句柄 $ fh的值打印到文件句柄$outFile。相反,您要打印整个当前行,该行位于$_

可以进行其他一些改进

  • 您应该始终使用open三参数形式,因此打开模式会自行显示为第二个参数

  • 无需测试open的{​​{1}}是否成功

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

这是你的程序应该如何看待。我希望它有所帮助。

autodie

答案 1 :(得分:0)

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

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

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

(FWIW,你已经开始使用3-arg打开你对open的其他两个电话。)

答案 2 :(得分:0)

虽然Borodin为您的问题提供了一个出色的解决方案,但是您可以通过另一个选项来传递您的问题。&#39;文件&#39;在命令行上命名脚本,让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。然后,push将文件名inFile2编辑到@ARGV上,如果$permitted{$phrase}为真,则读取该文件并打印一行。

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

希望这有帮助!