http://www.perlmonks.org?node_id=559808


in reply to File modification

You don't need a 3-argument open when the open doesn't have any user input in it. And obfuscating the code doens't really help either, even if the result is shorter.
use strict; use warnings; my ($argact, $handle, $num); ($argact) = $ARGV[0] =~ /(\d+)/; exit if !$argact; open $handle, 'one.txt'; $_ = join '', <$handle>; close $handle; ($num) = m/(\d+)$/; if ($num != $argact) { s/(\d+)$/$argact/; open $handle, '>one.txt'; print $handle $_; close $handle; }

Replies are listed 'Best First'.
Re^2: File modification
by liverpole (Monsignor) on Jul 07, 2006 at 18:13 UTC
    It's true you don't need the 3-argument open, but I believe it's considered good programming practice, if for no other reason than getting users in the habit of using safer code.

    Your example has other issues, though.  While it's true you're exiting if the argument isn't numeric, it might be confusing to the user not to get a syntax message.  And if no argument is given, instead of a more friendly syntax message one gets:

    Use of uninitialized value in pattern match (m//) at ./mytest line 8.

    Additionally, because of the '$' in the regex, there's the problem of input which doesn't contain digits at the very end, which will fail even if there's an extra newline in the input:

    Use of uninitialized value in pattern match (m//) at ./mytest line 15.


    s''(q.S:$/9=(T1';s;(..)(..);$..=substr+crypt($1,$2),2,3;eg;print$..$/