in reply to Help with logic/syntax
G'day randompug,
Welcome to the monastery.
Here's a way to do this that doesn't involve slurp mode or any regexes:
$ perl -Mstrict -Mwarnings -E ' my @data = ( "# hostname 123", "hostname 123", "vlan create vif1 1 2 3 4 5 6", "vlan add vif1 7 8 ", "ifconfig vif1-1 some data here", "ifconfig vif1-2 some data here", "..", "ifconfig vif1-9 some data here", "# hostname 456", "hostname 456", "vlan create vif5 1 2", "vlan add vif5 3 4 5", "vlan add vif5 6 7 8 9", "ifconfig vif5-1 some data here", "ifconfig vif5-2 some data here", "..", "ifconifg vif5-9 some data here", ); my ($hostname, @hosts, %host_data); for (@data) { my @fields = split; if ($fields[0] eq "hostname") { push @hosts => ($hostname = $fields[1]); } elsif ($fields[0] eq "vlan") { $host_data{$hostname}{vlan} += @fields - 3; } elsif ($fields[0] eq "ifconfig") { ++$host_data{$hostname}{ifconfig}; } } for (@hosts) { say "Hostname: $_"; say "vlans: $host_data{$_}{vlan}"; say "ifconfigs: $host_data{$_}{ifconfig}"; } ' Hostname: 123 vlans: 8 ifconfigs: 3 Hostname: 456 vlans: 9 ifconfigs: 2
I don't know where your real data is coming from: you should be able to just change "for (@data) {" to "while (<$file_handle>) {" (or whatever's appropriate) and get the same results. I'll leave you to check the vlan/ifconfig count. Your one instance of ifconifg may be intended for testing or perhaps just a typo.
-- Ken
|
|---|