如何解决需要帮助在 perl 中填充结构数组
我需要一些帮助来填充由 perl 结构组成的数组。
数组的数据来自一个.SH文件,格式如下:
108,Country,Location,ap17,ip_149,ssh,model,12/8/2020
我使用的代码如下:
use strict;
use warnings;
use Class::Struct;
struct(Net_Node => [hostname => '$',dir_ip => '$',access => '$',user => '$',pass => '$']);
my $node = Net_Node->new();
my @nodes;
my $user = "hjack";
my $pass = 'butstalion';
my $line;
my @all;
my $counter=0;
open(my $fh,'<',"exaple.sh") or die "Failed to open especified file";
#system('clear');
foreach $line (<$fh>) {
@all=split(',',$line);
$node->hostname ($all[3]);
$node->dir_ip ($all[4]);
$node->access ($all[5]);
$node->user ($user);
$node->pass ($pass);
$nodes[$counter] = $node;
$counter++;
}
my $size = @nodes;
print "\n \n";
print ("array size = $size\n\n");
$counter = 0;
while ($counter < 20) {
print ($counter,"\n\n");
print ($nodes[$counter]->hostname,"\n");
print ($nodes[$counter]->dir_ip,"\n");
print ($nodes[$counter]->access,"\n");
print ($nodes[$counter]->user,"\n");
print ($nodes[$counter]->pass,"\n\n");
$counter++;
}
close($fh);
这段代码的输出是一个填充数组,但只有在 foreach 循环中生成的最后一个元素,有没有办法用 .SH 文件的数据填充这个数组?
提前致谢
文件的数据如下
89,sw01,ip_10,12/8/2020
90,sw02,ip_18,12/8/2020
91,sw03,ip_26,12/8/2020
92,sw04,ip_27,12/8/2020
93,sw05,ip_28,12/8/2020
94,sw06,ip_29,12/8/2020
95,ap02,ip_13,12/8/2020
96,ap03,ip_12,12/8/2020
97,ap04,ip_20,12/8/2020
98,ap05,ip_14,12/8/2020
99,ap06,ip_15,12/8/2020
100,ap07,ip_16,12/8/2020
101,ap08,ip_17,12/8/2020
102,ap09,12/8/2020
103,ap10,ip_19,12/8/2020
104,ap11,ip_24,12/8/2020
105,ap12,ip_25,12/8/2020
106,ap14,12/8/2020
107,ap15,ip_37,12/8/2020
108,12/8/2020
解决方法
my $node = Net_Node->new();
...
foreach $line (<$fh>) {
...
$nodes[$counter] = $node;
}
创建单个 Net_Node
实例并在 foreach
循环的每次迭代中覆盖其数据。听起来您想为循环的每一行创建一个新实例。因此,您应该将 Net_Node->new()
调用移到循环内。
foreach $line (<$fh>) {
my $node = Net_Node->new();
...
$nodes[$counter] = $node;
}
使用更简单的数据结构(如原生 Perl 哈希),您可以将数据结构的副本附加到您的列表中
$nodes[$counter] = { %$node };
但我更不愿意对一个对象这样做,它甚至可能不会在内部表示为哈希引用。
,也许代码可以实现为以下形状
评论:
- 定义节点结构
- 为了可读性,定义一个包含感兴趣的描述性字段的数组
- 逐行读取文件
- 将感兴趣的数据临时放入散列中
- 在每次迭代中创建一个新节点
- 用哈希中的数据填充节点
- 将节点存储在数组中
- 为节点数据生成输出
#!/usr/bin/env perl
#
# vim: ai ts=4 sw=4
use strict;
use warnings;
use feature 'say';
use Class::Struct Net_Node => [
hostname => '$',dir_ip => '$',access => '$',user => '$',pass => '$'
];
my @fields = qw/hostname dir_ip access/;
my($user,$pass) = qw/hjack bustalion/;
my @nodes;
while( <DATA> ) {
next if /^$/; # skip empty lines
chomp;
my %data;
my $node = new Net_Node;
@data{@fields} = (split(',',$_))[3..5];
$node->hostname( $data{hostname} );
$node->dir_ip( $data{dir_ip} );
$node->access( $data{access} );
$node->user( $user );
$node->pass( $pass );
push @nodes,$node;
}
say "\nTotal nodes = " . @nodes;
my $counter = 10;
for my $node ( @nodes ) {
last unless $counter--;
say "
Hostname : " . $node->hostname . "
Dir_IP : " . $node->dir_ip . "
Access : " . $node->access . "
Userid : " . $node->user . "
Passwd : " . $node->pass;
}
__DATA__
89,Country,Location,sw01,ip_10,ssh,model,12/8/2020
90,sw02,ip_18,12/8/2020
91,sw03,ip_26,12/8/2020
92,sw04,ip_27,12/8/2020
93,sw05,ip_28,12/8/2020
94,sw06,ip_29,12/8/2020
95,ap02,ip_13,12/8/2020
96,ap03,ip_12,12/8/2020
97,ap04,ip_20,12/8/2020
98,ap05,ip_14,12/8/2020
99,ap06,ip_15,12/8/2020
100,ap07,ip_16,12/8/2020
101,ap08,ip_17,12/8/2020
102,ap09,12/8/2020
103,ap10,ip_19,12/8/2020
104,ap11,ip_24,12/8/2020
105,ap12,ip_25,12/8/2020
106,ap14,12/8/2020
107,ap15,ip_37,12/8/2020
108,ap17,ip_149,12/8/2020
输出
Total nodes = 20
Hostname : sw01
Dir_IP : ip_10
Access : ssh
Userid : hjack
Passwd : bustalion
Hostname : sw02
Dir_IP : ip_18
Access : ssh
Userid : hjack
Passwd : bustalion
Hostname : sw03
Dir_IP : ip_26
Access : ssh
Userid : hjack
Passwd : bustalion
Hostname : sw04
Dir_IP : ip_27
Access : ssh
Userid : hjack
Passwd : bustalion
Hostname : sw05
Dir_IP : ip_28
Access : ssh
Userid : hjack
Passwd : bustalion
Hostname : sw06
Dir_IP : ip_29
Access : ssh
Userid : hjack
Passwd : bustalion
Hostname : ap02
Dir_IP : ip_13
Access : ssh
Userid : hjack
Passwd : bustalion
Hostname : ap03
Dir_IP : ip_12
Access : ssh
Userid : hjack
Passwd : bustalion
Hostname : ap04
Dir_IP : ip_20
Access : ssh
Userid : hjack
Passwd : bustalion
Hostname : ap05
Dir_IP : ip_14
Access : ssh
Userid : hjack
Passwd : bustalion
否则可以采用稍微不同的方法来实现类似的结果,而无需 Class::Struct
模块
#!/usr/bin/env perl
#
# vim: ai ts=4 sw=4
use strict;
use warnings;
use feature 'say';
my @fields = qw/hostname dir_ip access/;
my($user,$pass) = qw/hjack bustalion/;
my @nodes;
while( <DATA> ) {
next if /^$/;
chomp;
my $node;
$node->@{@fields} = (split(',$_))[3..5];
$node->@{qw/user pass/} = ($user,$pass);
push @nodes,$node;
}
say "\nTotal nodes = " . @nodes;
for my $node ( @nodes ) {
say "
Hostname : " . $node->{hostname} . "
Dir_IP : " . $node->{dir_ip} . "
Access : " . $node->{access} . "
Userid : " . $node->{user} . "
Passwd : " . $node->{pass};
}
__DATA__
89,12/8/2020
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。