Unless 'rgrep' does something completely different from 'egrep', 'fgrep' or 'grep', you're wrong:
$ cat foo
$foo ->[2];
print $_->{bar};
$sum += $_->[0] for @array;
$ fgrep -e '->' foo | perl -nwe '/(\S{3,80}->\S{5,80})/;print $1,"\n"'
Use of uninitialized value $1 in print at -e line 1, <> line 1.
Use of uninitialized value $1 in print at -e line 1, <> line 2.
Use of uninitialized value $1 in print at -e line 1, <> line 3.
$
He does prefilter the line. But the filter is just for '->' while the pattern requires context around the '->'.