use strict; use warnings; local $/ = ";\n"; # Assumes each statement is followed by a newline! while (){ s/((?> & \w+ \s*)) # Match ampersand, followed by subname # and optional whitespace. Use atomic # grouping ("?>") so perl won't backtrack # after this matches. ([^(]|$) # Ensure this is followed by a non-open-paren, # or this was the end of the statement. /$1()$2/gx; # If this matched, place () after the sub call. # OP's original substitution to remove "&" s/(&)(\w+(\([\"\w]*\))?)/$2/g; print "$_"; } __DATA__ &somesub; &somesub("foobar") my $foo = &bar(1); my @results = (&foo, &bar, &baz(1, "data")); my $stuff = (&foo, &baz(qw(other information), &data); &print;