Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 读取文件的代码有什么问题?_Perl - Fatal编程技术网

Perl 读取文件的代码有什么问题?

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

我一直在尝试读取一个名为“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 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不是一个数字?@Manu
if()
将测试正则表达式,只有在匹配的情况下才会执行
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)