I like to try to find some trigger that I can consider to be a record separator, and then use $/ accordingly. Here's an example wherein we use Traceroute: as the record separator. That means that the first record will be empty, since technically it shows up at the beginning of a record rather than at the end. After discarding the record separator, we can check to see if the rest of the record is empty (it will be in the case of the first time Traceroute: is seen, since nothing precedes it).
Next, in this example, we find another anchor and use it to locate the IP address that we're trying to reach. Capture that. Then count how many times a number appears at the beginning of a line (preceded by an optional space). Keep track of that count. The Lingua::EN::Inflect stuff is just for fun.
use Lingua::EN::Inflect qw( PL );
{
local $/ = 'Traceroute';
while( my $line = <DATA> ) {
chomp $line;
next unless length $line;
my ( $destination ) = $line =~ m/\(([^)]+)\)/;
my $count = () = $line =~ m/^\s*(\d+)\s{2}/mg;
print "$destination: $count ", PL( "hop", $count ), ".\n";
}
}
__DATA__
Traceroute: 11 1291796822 1291796821 1291796821 OpenDNS 0.chstatic.cvc
+dn.com 216.137.61.109
traceroute to 216.137.61.109 (216.137.61.109), 30 hops max, 60 byte pa
+ckets
1 192.168.178.1 0.638 ms 7.361 ms 7.366 ms
2 82.135.16.28 44.925 ms 46.633 ms 50.457 ms
3 212.18.7.121 98.010 ms 98.307 ms 98.650 ms
4 212.18.6.97 68.374 ms 72.222 ms 76.184 ms
5 62.140.24.49 129.246 ms 130.224 ms 130.221 ms
6 4.69.134.2 98.205 ms 105.207 ms 102.287 ms
7 4.69.140.10 106.816 ms 82.609 ms 4.69.140.2 88.631 ms
8 4.68.23.76 79.559 ms 65.093 ms 4.68.23.204 64.530 ms
9 212.162.24.70 65.476 ms 50.797 ms 55.108 ms
10 216.137.61.109 58.221 ms 62.351 ms 59.094 ms
Query: 18 1291796822 GoogleDNS 0.chstatic.cvcdn.com 1 True 0.155671834
+946 0.0507638454437
Traceroute: 2 1291796823 1291796822 1291796822 LocalDNS LocalDNS 192.1
+68.178.1
traceroute to 192.168.178.1 (192.168.178.1), 30 hops max, 60 byte pack
+ets
1 192.168.178.1 0.649 ms 1.033 ms 1.013 ms
Query: 13 1291796823 LocalDNS 0.media.collegehumor.com 1 True 0.193642
+139435 0.0472960472107
Traceroute: 9 1291796827 1291796822 1291796822 GoogleDNS GoogleDNS 8.8
+.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 192.168.178.1 0.464 ms * *
2 82.135.16.28 68.613 ms 72.079 ms 76.268 ms
3 212.18.7.101 160.966 ms 163.495 ms 163.517 ms
4 93.104.240.53 99.638 ms 103.396 ms 108.241 ms
5 209.85.241.110 111.919 ms 209.85.240.64 114.900 ms 209.85.241.11
+0 119.654 ms
6 209.85.254.116 124.134 ms 209.85.254.118 127.998 ms 209.85.254.1
+12 111.621 ms
7 209.85.249.166 116.258 ms 209.85.254.126 115.774 ms 209.85.254.1
+34 105.670 ms
8 8.8.8.8 95.428 ms 95.573 ms 95.923 ms
Query: 10 1291796827 OpenDNS 1.im.cz 1 True 0.0573320388794 0.05522108
+078
The output:
216.137.61.109: 10 hops.
192.168.178.1: 1 hop.
8.8.8.8: 8 hops.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.