Need help to populate a structs array in perl

Welcome to Programming Tutorial official website. Today - we are going to cover how to solve / find the solution of this error Need help to populate a structs array in perl on this date .

I need some help to populate an array made of structs in perl.

The data for the array comesfrom a .SH file with the following format :

108,Country,Location,ap17,ip_149,ssh,model,12/8/2020

The code I am using is as follows:

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 = $sizenn");
$counter = 0;

while ($counter < 20) {
        print ($counter,"nn");    
        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, "nn");

        $counter++;
}

close($fh);

The output of this code is a populated array but only with the last element generated in the foreach loop, is there any way to populate this array with the data of the .SH file?

Thanks in advance

the data of the file is as follows

89,Country,Location,sw01,ip_10,ssh,model,12/8/2020
90,Country,Location,sw02,ip_18,ssh,model,12/8/2020
91,Country,Location,sw03,ip_26,ssh,model,12/8/2020
92,Country,Location,sw04,ip_27,ssh,model,12/8/2020
93,Country,Location,sw05,ip_28,ssh,model,12/8/2020
94,Country,Location,sw06,ip_29,ssh,model,12/8/2020
95,Country,Location,ap02,ip_13,ssh,model,12/8/2020
96,Country,Location,ap03,ip_12,ssh,model,12/8/2020
97,Country,Location,ap04,ip_20,ssh,model,12/8/2020
98,Country,Location,ap05,ip_14,ssh,model,12/8/2020
99,Country,Location,ap06,ip_15,ssh,model,12/8/2020
100,Country,Location,ap07,ip_16,ssh,model,12/8/2020
101,Country,Location,ap08,ip_17,ssh,model,12/8/2020
102,Country,Location,ap09,ip_18,ssh,model,12/8/2020
103,Country,Location,ap10,ip_19,ssh,model,12/8/2020
104,Country,Location,ap11,ip_24,ssh,model,12/8/2020
105,Country,Location,ap12,ip_25,ssh,model,12/8/2020
106,Country,Location,ap14,ip_27,ssh,model,12/8/2020
107,Country,Location,ap15,ip_37,ssh,model,12/8/2020
108,Country,Location,ap17,ip_149,ssh,model,12/8/2020

Answer

my $node = Net_Node->new();
...
foreach $line (<$fh>) {
   ...
   $nodes[$counter] = $node;
}

creates a single Net_Node instance and overwrites its data in every iteration of the foreach loop. It sounds like you want to create a new instance for each line of the loop. So you should move your Net_Node->new() call inside the loop.

foreach $line (<$fh>) {
   my $node = Net_Node->new();
   ...
   $nodes[$counter] = $node;
}

With a simpler data structure like a native Perl hash, you could have appended a copy of the data structure to your list like

   $nodes[$counter] = { %$node };

but I would be more reluctant to do that with an object, which might not even be represented internally as a hash reference.