If you step through the array backward, you can delete (splice) out the redundant elements safely.
This will do it, but the code doesn't format nicely:
#! perl -slw use strict; use Data::Dump qw[ pp ]; my @a = map[ split ], <DATA>; substr( $a[$_-1][0],0,-1 ) eq substr( $a[$_][0],0,-1 ) and do{ $a[$_-1][1] += $a[$_][1]; splice @a, $_, 1; } for reverse 1 .. $#a; pp \@a; __DATA__ 19.25.55.11.144.0 5 19.25.55.14.16.0 12 19.25.59.200.208.0 8 19.25.59.204.160.0 7 19.25.60.5.176.0 4 19.25.60.15.48.0 0 19.25.60.17.240.0 3 19.25.60.18.96.0 5 19.25.115.138.224.0 30 19.25.115.141.32.0 4 26.109.108.64.144.0 1 38.153.162.89.0.0 1 38.153.162.89.0.1 0 38.153.162.89.96.0 0 38.153.162.89.96.1 0 38.153.162.95.64.0 0 38.153.162.95.64.1 0 58.152.64.24.192.0 1 58.152.64.24.192.1 0 58.152.64.46.48.0 3 58.152.64.46.48.1 0 58.152.94.71.0.0 1 58.152.94.71.0.1 0
Output:
C:\test>junk [ ["19.25.55.11.144.0", 5], ["19.25.55.14.16.0", 12], ["19.25.59.200.208.0", 8], ["19.25.59.204.160.0", 7], ["19.25.60.5.176.0", 4], ["19.25.60.15.48.0", 0], ["19.25.60.17.240.0", 3], ["19.25.60.18.96.0", 5], ["19.25.115.138.224.0", 30], ["19.25.115.141.32.0", 4], ["26.109.108.64.144.0", 1], ["38.153.162.89.0.0", 1], ["38.153.162.89.96.0", 0], ["38.153.162.95.64.0", 0], ["58.152.64.24.192.0", 1], ["58.152.64.46.48.0", 3], ["58.152.94.71.0.0", 1], ]
In reply to Re: Combining Duplicate entries in an Array
by BrowserUk
in thread Combining Duplicate entries in an Array
by mmartin
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |