Perl 读取文件的代码有什么问题?
我一直在尝试读取一个名为“perlthisfile.txt”的文件,它基本上是我计算机上nmap的输出 我只想打印出ip地址,因此我编写了以下代码,但它不起作用:Perl 读取文件的代码有什么问题?,perl,Perl,我一直在尝试读取一个名为“perlthisfile.txt”的文件,它基本上是我计算机上nmap的输出 我只想打印出ip地址,因此我编写了以下代码,但它不起作用: #!/usr/bin/perl use strict; use warnings; use Scalar::Util qw(looks_like_number); print"\n running \n"; open (MYFILE, 'perlthisfile.txt') or die "Cannot open fil
#!/usr/bin/perl
use strict;
use warnings;
use Scalar::Util qw(looks_like_number);
print"\n running \n";
open (MYFILE, 'perlthisfile.txt') or die "Cannot open file\n";
while(<MYFILE>) {
chomp;
my @value = split(' ', <MYFILE>);
print"\n before foreach \n";
foreach my $val (@value) {
if (looks_like_number($val)) {
print "\n looks like number block \n";
if ($val == /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5})/) {
print "\n$val\n";
}
}
}
}
close(MYFILE);
exit 0;
My perlthisfile.txt:
Starting Nmap 6.00 ( http://nmap.org ) at 2013-10-16 22:59 EST
Nmap scan report for BoB2.iiNet (10.1.1.1)
Nmap scan report for android-fbff3c3812154cdc (10.1.1.3)
All 1000 scanned ports on android-fbff3c3812154cdc (10.1.1.3) are closed
Nmap scan report for 10.1.1.5
All 1000 scanned ports on 10.1.1.5 are open|filtered
Nmap scan report for 10.1.1.6
All 1000 scanned ports on 10.1.1.6 are closed
这里有几个问题。正如@toolic所说,在
拆分中调用
可能不是您想要的-它将从文件中读取下一条记录,请改用$
另外,如果要对正则表达式使用=
,则应使用绑定运算符,=~
(=
仅用于Perl中的数字比较):
我建议如果正则表达式起作用,看起来像\u number
是多余的。我怀疑您使用它是因为=
根据您使用的perl版本给出了类似于在数值等式(==)中不是数字的东西。您有一些错误,其中一个是regex,它应该有端口号的可选部分(:
和后面的\d{1,5}
)
#/usr/bin/perl
严格使用;
使用警告;
打开(my$MYFILE,“如果它看起来是这样的,这是一个提取IP的快速黑客程序,那么您可能会通过一些简单的操作逃脱,例如:
perl -nlwe '/((?:\d+\.)+\d+)/ && print $1' perlthisfile.txt
也就是说,无论如何都不是一个非常严格的正则表达式,它只是匹配由句点连接的数字。如果您只想打印唯一的IP,您可以使用哈希来消除重复:
perl -nlwe '/((?:\d+\.)+\d+)/ && !$seen{$1}++ && print $1" perlthisfile.txt
使用与端口号匹配的稍紧的正则表达式:
perl -nlwe '/((?:\d+[\.:]){3,4}\d+)/ && print $1' perlthisfile.txt
这将不允许较短的数字链,并允许端口号
最后一个正则表达式解释如下:
/( # opening parenthesis, starts a string capture
(?: # a non-capturing parenthesis
\d+ # match a number, repeated one or more times
[\.:] # [ ... ] is a character class, it matches one of the literal
# characters inside it, and only one time
){3,4} # closing the non-capturing parenthesis, adding a quantifier
# that says this parenthesis can match 3 or 4 times
\d+ # match one or more numbers
)/x # close capturing parenthesis (added `/x` switch)
/x
开关只是为了让您可以按原样使用上面的正则表达式,带有注释和空格
这背后的逻辑很简单:我们想要一个由数字后跟句号或冒号组成的字符串。我们想要这个字符串3到4次。以另一个数字结束
+
和{3,4}
是量词,它们规定了左侧项目应该匹配的次数。默认情况下,每个项目匹配一次,但通过使用量词,您可以更改它。+
是{1,}
的缩写,您还具有:
?->{1,0}
*->{0,}
语法是{min,max}
,当一个数字丢失时,这意味着尽可能多的次数。能否在if(regex)之前添加print$val
?您的regex可能不匹配。@Konerak print“看起来像数字”是在regex语句之前请不要将标记冗余地放在标题中。@KonradRudolph,很抱歉,我已经更改了拆分函数,我无法知道regex是否工作,因为文件中有字符串,我正在像处理数字一样处理它们。所以当我compile@Manu:您是否已将==
更改为=~
?这是pr很可能是==
导致了您的错误!那么您遇到了哪些错误?请您更新问题中的代码好吗?mpapec发现我的正则表达式有问题,我也在查找端口号,cheers@Manu:但是您的示例中没有端口号。您确定它不仅仅是在替换==
?请忽略e最后一条评论它可以工作非常感谢大家。请给我们一点解释,为什么我们使用my($match)时它可以工作,是吗,我的意思是为什么我没有收到错误,说nmap不是一个数字?@Manuif()
将测试正则表达式,只有在匹配的情况下才会执行print
。你可以使用else{}
branch and report problem,check update..wao man,这太棒了,我的下一步就是只打印唯一的IP,我从来没有使用过perl,今天是我的第一次,我真的很喜欢它。这太棒了,我真的可以这么做。太棒了appreciated@Manu您可以用Perl做任何事情快速编写程序并利用命令行实用程序。我将学习这一点,但正则表达式真的很可怕,如果可能的话,请发布一些有用的perl链接。就我个人而言,我主要是通过阅读来学习的。你可能会喜欢perlre和perlretut。还有一些web服务会为你解释正则表达式。这并不是那么简单很感谢你的朋友,我只是想让你知道,你写的东西让我非常想学习perl。我一定会看看那些版本。非常感谢
perl -nlwe '/((?:\d+\.)+\d+)/ && !$seen{$1}++ && print $1" perlthisfile.txt
perl -nlwe '/((?:\d+[\.:]){3,4}\d+)/ && print $1' perlthisfile.txt
/( # opening parenthesis, starts a string capture
(?: # a non-capturing parenthesis
\d+ # match a number, repeated one or more times
[\.:] # [ ... ] is a character class, it matches one of the literal
# characters inside it, and only one time
){3,4} # closing the non-capturing parenthesis, adding a quantifier
# that says this parenthesis can match 3 or 4 times
\d+ # match one or more numbers
)/x # close capturing parenthesis (added `/x` switch)