Perl使用print和inderect处理程序从一个文件读取并写入另一个文件
我有一个名为malwareip.txt的文件,其列表为IP: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
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