需要帮助在 perl 中填充结构数组

如何解决需要帮助在 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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-