in reply to Help parsing this data
Maybe for a large file it might be faster with memoize. Or maybe not. Benchmark testing is left up to the user :)
#!/usr/bin/perl # http://perlmonks.org/?node_id=1138357 use strict; use warnings; $_ = <<END; PID PPID COMMAND 0 0 sched 1 0 /sbin/init 7 0 vmtasks 105 1 /usr/lib/saf/sac 7184 1 /usr/bin/java 7222 1 /usr/lib/utmpd 7501 6223 /usr/sbin/nscd 7507 7184 /bin/sh 7508 7507 /usr/bin/perl 7510 5044 /usr/bin/grep 7512 4333 /usr/bin/egrep 7515 7508 sh 7516 7515 <defunct> 8000 1 /second/example/for/testing 8001 8000 <defunct> END my (%pids, %memoize); $pids{$2} = [$3, $1] while /^(\s*(\d+)\s+(\d+).*\n)/gm; sub trace { $memoize{$_[0]} //= do { my ($ppid, $line) = @{ $pids{shift()} }; ($ppid ? trace($ppid) : "\n") . $line; } } print trace $_ for /^\s*(\d+)\s+\d+\s+<defunct>/gm;
|
|---|