Perl使用print和inderect处理程序从一个文件读取并写入另一个文件

Perl使用print和inderect处理程序从一个文件读取并写入另一个文件,perl,printing,Perl,Printing,我有一个名为malwareip.txt的文件,其列表为IP: 1.1.1.1 2.2.2.2 我需要读取此文件并创建另一个文件(query.txt),以便最终结果为: ip.dst=1.1.1.1 || ip.dst=2.2.2.2 我创建了以下脚本。但是,我在第一行看到一个|,如下所示: ||ip.dst=1.1.1.1 ||ip.dst=2.2.2.2 为什么在ip.dst=1.1.1.1之前得到| 请参阅下面的脚本。谢谢 #!/usr/bin/env perl use stric

我有一个名为malwareip.txt的文件,其列表为IP:

1.1.1.1
2.2.2.2
我需要读取此文件并创建另一个文件(query.txt),以便最终结果为:

ip.dst=1.1.1.1 || ip.dst=2.2.2.2
我创建了以下脚本。但是,我在第一行看到一个
|
,如下所示:

||ip.dst=1.1.1.1 
||ip.dst=2.2.2.2
为什么在
ip.dst=1.1.1.1
之前得到
|

请参阅下面的脚本。谢谢

#!/usr/bin/env perl

use strict;
use warnings;

my $filename="malwareip.txt";
open (my $ip, "<" , $filename) || die ("Can't open file malwareip.txt");

my $outputfile="query.txt";
open (my $out, ">" , $outputfile) || die ("CAN'T OPEN FILE  query.txt");

my $OR="||";
while ( <$ip> ) {
    next if  (/^$/); 
    printf $out "ip.dst=$_$OR";
}

close $out;
close $ip;
#/usr/bin/env perl
严格使用;
使用警告;
my$filename=“malwareip.txt”;

打开(我的$ip,"您当前的输出没有意义,因为您无法在输出的开始处获得
|
,除非您在那里打印它。即使您的文件中碰巧有空行,也不会,因为它仍然会在该空行之前打印
ip.dst=
。因此,您一定是弄错了获取该输出,或者获取该代码

因为你忘记了咀嚼你的输入,你通常会得到这样的输出

ip.dst=1.1.1.1
||ip.dst=2.2.2.2
||
如果您有非标准的行结尾,例如使用带有CR
\r
的文件,那么您的所有行都将被覆盖,但您只会得到一行输出:最后一行

||ip.dst=2.2.2.2
因此,您的输出毫无意义,在提供更多信息之前无法解释

如果我要做这样的事,我会:

perl -lwe 'chomp(@a = <>); print join "||", grep /\S/, @a;' malwareip.txt > query.txt
perl-lwe'chomp(@a=);print join“| |”,grep/\S/,@a;'malwareip.txt>query.txt
  • 您缺少
    chomp
  • 每次打印时,您都在打印
    |
    ,即使您希望少打印一次
  • 在需要LF行结尾的系统上,您可能有CRLF行结尾。
    s/\s+\z/
    将同时选择LF和CRLF行结尾


您需要选择输入行吗?这样做:
使用数据::转储程序;$Data::转储程序::Useqq=1;…打印转储程序$\ucode>(将print语句放入while循环中。使用
编辑
按钮在问题中发布输出。@MartinBroadhurst是的,他这样做了,但这不能解释为什么| |结束于第一个字符串的开头。windows行结尾可能解释覆盖,但不能预先结束它。输出没有意义,OP做了一些修改报告时有点错误。我永远都不知道为什么人们发布一个问题,然后就放弃几个小时。
不要落入使用“printf”的陷阱,因为一个简单的“print”就可以了。“print”更高效,更不容易出错。
--perldoc-f printfThanks to every one for your answer.我会看看你的答案,然后给你们提供正确的解决方案。操作系统是UBUNTU。我使用了这个解决方案的一个变体来获得我想要的结果,如下所示:我使用了你答案的一个变体来获得我想要的结果。谢谢你为了@tlp,不知什么原因,我得到了上面的输出。但是a仔细看了看,正如你所说,我通常得到的输出与你上面显示的完全相同。非常感谢你的澄清
my $OR = '';
while ( <$ip> ) {
    s/\s+\z//;
    next if /^$/; 
    print $out "${OR}ip.dst=$_";
    $OR = ' || ';
}

print $out "\n";
print $out "${OR}ip.dst=$_";          # ok
printf $out "%s", "${OR}ip.dst=$_";   # ok
printf $out "%sip.dst=%s", $OR, $_;   # ok
printf $out "${OR}ip.dst=$_";         # Not really ok