当脚本在结果文本文件中打印整行文本文件时出现问题:
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;
请问好吗?
谢谢
答案 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参数将输出保存到文件中。
希望这有帮助!