This is built-in behavior in Perl. From perlrun:
in reply to Re^2: How to write a program to read stdin or command line?
in thread How to write a program to read stdin or command line?
The null filehandle <> is special: it can be used to emulate the behavior
of sed and awk. Input from <> comes either from standard input, or from
each file listed on the command line. Here’s how it works: the first
time <> is evaluated, the @ARGV array is checked, and if it is empty,
$ARGV is set to "-", which when opened gives you standard input. The
@ARGV array is then processed as a list of filenames.