Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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_Sorting - Fatal编程技术网

Perl排序多列数组

Perl排序多列数组,perl,sorting,Perl,Sorting,hostlist.txt文件只有一列。程序读取hostlist.txt文件,删除重复的主机名,对列表进行排序,查找列表中每个主机的ip地址,并在终端上打印输出 hostlist.txt 终端输出 节目: 输出: 我建议为此使用哈希数组: ..... my ($type, $hostname, $location) = split /,/, $line; push @records, { type => $type, hostname => $hostname,

hostlist.txt
文件只有一列。程序读取
hostlist.txt
文件,删除重复的主机名,对列表进行排序,查找列表中每个主机的ip地址,并在终端上打印输出

hostlist.txt 终端输出 节目: 输出:
我建议为此使用哈希数组:

.....
my ($type, $hostname, $location) = split /,/, $line;
push @records, {
    type => $type,
    hostname => $hostname,
    location => $location,
};
.....

my @records_sorted = sort { $a->{type} cmp $b->{type} || $a->{location} cmp $b->{location} || $a->{hostname} cmp $b->{hostname} } @records;
...

我建议为此使用哈希数组:

.....
my ($type, $hostname, $location) = split /,/, $line;
push @records, {
    type => $type,
    hostname => $hostname,
    location => $location,
};
.....

my @records_sorted = sort { $a->{type} cmp $b->{type} || $a->{location} cmp $b->{location} || $a->{hostname} cmp $b->{hostname} } @records;
...
#/usr/bin/perl
严格使用;
使用警告;
打开(我的$fh,
#!/usr/bin/perl
严格使用;
使用警告;

open(my$fh),ETA:添加了对IPADR查找失败的检查

最简单的处理方法是使用菱形操作符,我觉得:

use strict;
use warnings;
use ARGV::readonly;

my %seen;
while (<>) {
    chomp;  # to avoid missing newline at eof errors
    next if $seen{$_};
    $seen{$_}++; 
    my @row = split /,/, $_;
    my @host = gethostbyname($hostname); 
    my $ipaddr;
    if (@host == 0) { 
         $ipaddr = "host not found - ip not avail";
    } else {
         $ipaddr = inet_ntoa($host[4]);
    } 

    splice @row, 2, 0, $ipaddr;
    print join ",", @row;
}
使用严格;
使用警告;
使用ARGV::readonly;
我看到的百分比;
而(){
chomp;#避免在eof错误时丢失换行符
下一个if$seen{$};
$seen{$}++;
我的@row=split/,/,$;
my@host=gethostbyname($hostname);
我的$ipaddr;
如果(@host==0){
$ipaddr=“找不到主机-ip不可用”;
}否则{
$ipaddr=inet_ntoa($host[4]);
} 
拼接@行,2,0,$ipaddr;
打印连接“,”,@行;
}
使用允许更安全地使用与菱形运算符一起使用的隐式文件打开

之后,只需使用散列删除已经看到的行,拆分行,在需要的位置输入所需的值,然后打印重新组装的行


如果您希望行中有更复杂的数据,您可能希望查看csv模块,例如。

ETA:添加了IPADR查找失败的检查

最简单的处理方法是使用菱形操作符,我觉得:

use strict;
use warnings;
use ARGV::readonly;

my %seen;
while (<>) {
    chomp;  # to avoid missing newline at eof errors
    next if $seen{$_};
    $seen{$_}++; 
    my @row = split /,/, $_;
    my @host = gethostbyname($hostname); 
    my $ipaddr;
    if (@host == 0) { 
         $ipaddr = "host not found - ip not avail";
    } else {
         $ipaddr = inet_ntoa($host[4]);
    } 

    splice @row, 2, 0, $ipaddr;
    print join ",", @row;
}
使用严格;
使用警告;
使用ARGV::readonly;
我看到的百分比;
而(){
chomp;#避免在eof错误时丢失换行符
下一个if$seen{$};
$seen{$}++;
我的@row=split/,/,$;
my@host=gethostbyname($hostname);
我的$ipaddr;
如果(@host==0){
$ipaddr=“找不到主机-ip不可用”;
}否则{
$ipaddr=inet_ntoa($host[4]);
} 
拼接@行,2,0,$ipaddr;
打印连接“,”,@行;
}
使用允许更安全地使用与菱形运算符一起使用的隐式文件打开

之后,只需使用散列删除已经看到的行,拆分行,在需要的位置输入所需的值,然后打印重新组装的行



如果您希望行中有更复杂的数据,您可能希望查看csv模块,例如。

Holy,这太棒了。我只了解排序部分(来自在线研究),但不知道代码的其他部分是如何工作的。不过,有一点是,有一个“空间”在每行前面的第2行开始。我如何消除它?发现了另一个问题:如果主机名不返回ip地址,脚本将停止。我在网上找到了这段代码,我如何将它合并到代码中?
my@host=gethostbyname($hostname);if(scalar(@host)==0){$ipaddr=“host not found-ip not avail”;}else{$ipaddr=inet_ntoa($host[4])}
map
看起来很酷,但它并不容易阅读,也很难维护,特别是对于不太熟悉perl的人来说
是一个常见的Perl习语,被称为@flesk,谢谢!!“空格”仍然存在,我通过在末尾添加这个块来消除它们:foreach$date(@data){chomp($data);}天哪,这太棒了。我只理解排序部分(来自在线研究),但不知道代码的另一部分是如何工作的。不过,有一件事是,有一个“空间”“在每行前面的第2行开始。我如何消除它?发现另一个问题:如果主机名不返回ip地址,脚本将停止。我在网上找到了这段代码,我如何将它合并到代码中?
my@host=gethostbyname($hostname);if(scalar(@host)==0){$ipaddr=“host not found-ip not avail”;}else{$ipaddr=inet_ntoa($host[4])}
map
看起来很酷,但它并不容易阅读,也很难维护,特别是对于不太熟悉perl的人来说
是一个常见的Perl习语,被称为@flesk,谢谢!!空格仍然存在,我通过在末尾添加这个块来消除它们:foreach$date(@data){chomp($data);}感谢排序工作,但我仍然需要过滤重复的主机名。我想需要一些adv Perl魔术。:)首先将它们存储为散列,而不是散列数组,您应该能够避免重复。感谢排序工作,但我仍然需要过滤重复的主机名。我想需要一些adv Perl魔术。:)首先将它们存储为散列,而不是散列数组,您应该能够避免重复。+1,非常可读。但是为什么要使用if(@host==0)而不是除非(@host)?@yvindSkaar我刚刚从注释中修改了OPs代码,它最初是
if(scalar(@host)==0)
除非(@host)
同样有效,我刚刚指出,
标量
对于已经在标量上下文中的数组是多余的。我是否可以建议将
下一个if$seen{$};
$seen{$}++
更改为刚刚
下一个if$seen{$}++;
?@flesk你可以这么做,但我不知道这是否有真正的意义。@TLP:除此之外,它们在逻辑上是一致的,因为它们是同一个“看到时跳过表达式”的一部分,但这可能是一个意见问题。+1,可读性很强。但是为什么要使用if(@host==0)而不是除非(@host)?@yvindSkaar我刚从一条评论中修改了OPs代码,它最初是
if(scalar(@host)==0)
除非(@host)
也能正常工作,我只是指出
scalar
对于已经在scalar上下文中的数组是多余的。我是否也可以建议
dell,host03,192.168.1.33,dc1
hp,host02,192.168.1.12,dc1
dell,host01,192.168.1.15,dc2
.....
my ($type, $hostname, $location) = split /,/, $line;
push @records, {
    type => $type,
    hostname => $hostname,
    location => $location,
};
.....

my @records_sorted = sort { $a->{type} cmp $b->{type} || $a->{location} cmp $b->{location} || $a->{hostname} cmp $b->{hostname} } @records;
...
#!/usr/bin/perl
use strict;
use warnings;

open(my $fh, '<', "newhostlist.txt") or die "Unable to open file: $!\n";

my %unique = map {$_ => 1} <$fh>;

my @data = 
    map {join",", ($_->[0], $_->[1], (@{$_->[3]}=gethostbyname($_->[1]))?inet_ntoa($_->[3][4]):'-' , $_->[2])}
    sort {$a->[0] cmp $b->[0] ||
          $a->[2] cmp $b->[2] ||
          $a->[1] cmp $b->[1]}
    map {s/^\s+|\s+$//g; [split/,/]} keys %unique;
use strict;
use warnings;
use ARGV::readonly;

my %seen;
while (<>) {
    chomp;  # to avoid missing newline at eof errors
    next if $seen{$_};
    $seen{$_}++; 
    my @row = split /,/, $_;
    my @host = gethostbyname($hostname); 
    my $ipaddr;
    if (@host == 0) { 
         $ipaddr = "host not found - ip not avail";
    } else {
         $ipaddr = inet_ntoa($host[4]);
    } 

    splice @row, 2, 0, $ipaddr;
    print join ",", @row;
}