-1

我有一个名为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;
4

2 回答 2

2

您当前的输出没有意义,因为||除非您在那里打印,否则您无法在输出的开头获得。即使您的文件中碰巧有空行,也不会,因为它仍会ip.dst=在该空行之前打印。因此,您在获取该输出或拥有该代码方面一定是错误的。

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

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
于 2013-10-13T11:51:46.117 回答
0
  • 你不见了chomp
  • ||每次打印时都在打印,即使您想要少打印一张。
  • 您可能在需要 LF 行结尾的系统上有 CRLF 行结尾。s/\s+\z//将切断 LF 和 CRLF 行尾。

my $OR = '';
while ( <$ip> ) {
    s/\s+\z//;
    next if /^$/; 
    print $out "${OR}ip.dst=$_";
    $OR = ' || ';
}

print $out "\n";

注意使用print而不是printfprintf期望它的第一个参数是格式参数。

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
于 2013-10-13T15:15:15.210 回答