sub match_url { my $row = shift; # No @_ required, that is the default my @matches = ($row =~ m/$re/g) or return; # do something with @matches } if (!@ARGV or $ARGV[0] eq "-") { chomp (@ARGV = ); # chomp can be done in one go match_url ($_) for @ARGV; # Your match_url takes one arg, not a list } else { # Do I need to handle the error case with this syntax? while (<>) { chomp $_; # Is chomp really needed? match_url probably ignores trailing EOL in $re match_url ($_); } }