使用Perl从一个变量中获取多个IP地址以打印列表

时间:2013-11-14 15:01:09

标签: perl ip ip-address country

我需要脚本逐行打印出IP地址列表以及相应的用户名和电子邮件地址以及国家/地区。如何获取多个IP地址来执行命令?我尝试了一个循环,但它只显示了一行IP地址。我希望我的输出看起来像:

1 | login | emailadd@yahoo.com | 160.79.208.82 | United States
16 | login1 | emailadd@yahoo.com | 61.95.83.10 | Italy
23 | login2 | emailadd@gmail.com | 81.48.63.93 | Australia
36 | login3 | emailadd@yahoo.com | 38.117.170.82 | Japan
51 | login4 | emailadd@gmail.com | 2.233.30.85 | Mexico

这是我的代码:

#!/usr/bin/perl -w
use lib '~/lib';
use strict;
use Net::IPInfoDB;

my $g = Net::IPInfoDB->new;
$g->key(api_key);

my $login = '1 | login | emailadd@yahoo.com | 160.79.208.82
            16 | login1 | emailadd@yahoo.com | 61.95.83.10 
            23 | login2 | emailadd@gmail.com | 81.48.63.93 
            36 | login3 | emailadd@yahoo.com | 38.117.170.82 
            51 | login4 | emailadd@gmail.com | 2.233.30.85';

$login =~ /(\d+\.\d+\.\d+\.\d+)/;

my $city = $g->get_city("$1");
my $addr = $g->get_country("$1");


printf "$login | (%s, %s)\n",
$city->city_name, $addr->country_name;

3 个答案:

答案 0 :(得分:1)

如果您想坚持不使用阵列,这里是获取IP地址的解决方案。

while ($login =~ m/(\d+\.\d+\.\d+\.\d+)/g) {
    print "$1\n";
}

答案 1 :(得分:1)

使用/g查找所有匹配项。

my @ips = /(\d+\.\d+\.\d+\.\d+)/g;

那就是说,你显然想要第4场,所以让我们真的这样做,而不是冒险从第三场获得一些东西。

sub trim { my ($s) = @_; $s =~ s/^\s+//; $s =~ s/\s+\z//; $s }

for (split /^/m, $login) {
   chomp;
   my @fields = map trim($_), split /\|/;
   my $ip = $fields[2];
   ...
}

答案 2 :(得分:0)

您只获得一个IP地址,因为它正是您在整个$ login上应用正则表达式ONCE所做的。

#we split $login into an array, line-by-line
my @lines = split("\n",$login);
for my $line (@lines) {
    #now we iterate through every line one-by-one
    $line =~ /(?<ip>\d+\.\d+\.\d+\.\d+)/;

    print $+{"ip"}."\n";
}

这里我们遍历$ login的每一行,我们分别为每一行应用正则表达式。而不是打印ofc,你可以用你的ip做任何你想做的事。

此外我在这里使用名为match,这只是我的偏好,你不必使用它。