in reply to Piping into system commands

Firstly, 'cp' takes its arguments on the command line. It does nothing with data sent over STDIN. You probably mean to do something like this:
system("cp", "file1", "file2") and die "..."; # system returns false +upon success, not true
Of course, it's only a few lines to repeat this procedure in Perl if you wanted to avoid the system overhead entirely.

Additionally, this statement is incorrect:

print COPY "file1 file2" || die("Could not print to COPY: $!");
The || operator binds very tightly here (it has a high precedence), so if we were to use parenthesis just about everywhere we could, it would look a bit like this:
print COPY ("file1 file2" || die("..."));
When making 'or'-type decisions based upon execution, you want to use a lower-precedence operator like 'or' instead of '||'. Only use || when you want to make a decision based upon values, and want to use $value1 || $value2.