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


in reply to Using the DATA file handle for ARGV

I found a simple example to test this on.

use strict; use warnings; BEGIN { *ARGV = *DATA unless @ARGV } my $timestamp = $ARGV[0]; my ($year,$month,$day,$hour,$minute,$second) = ($timestamp =~ /(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/); printf "%s is %d seconds\n",$timestamp, ((($year * 365 + $day) * 24 + +$hour) * 60 + $minute) * 60 + $second; __DATA__ 620731142301

$timestamp is not picking up the value from DATA. What am I doing wrong?

Replies are listed 'Best First'.
Re^2: Using the DATA file handle for ARGV
by choroba (Cardinal) on Nov 13, 2013 at 17:52 UTC
    The trick influences how the diamond operator <> works, i.e. what *ARGV{IO} does. The behaviour of @ARGV is a different story and is not related to the trick. To see it work, change the line 5 to
    my $timestamp = <>;
    لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ

      This works for DATA, but not for an argument. The point of this trick, as I understood it, was to allow the program to use DATA if an argument was not passed.

      use strict; use warnings; BEGIN { *ARGV = *DATA unless @ARGV } my $timestamp = <>; my ($year,$month,$day,$hour,$minute,$second) = ($timestamp =~ /(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/); printf "%s is %d seconds\n",$timestamp, ((($year * 365 + $day) * 24 + +$hour) * 60 + $minute) * 60 + $second; __DATA__ 620731142301
      $: perl secsis.pl 620731142301 is 1957962181 seconds $: perl secsis.pl 131113135710 Can't open 131113135710: No such file or directory at secsis.pl line 5 +. Use of uninitialized value in pattern match (m//) at secsis.pl line 7. ...
        No. You either specify no argument, in which case the script processes the DATA section, or you provide a file name, in which case the script processes the file. For a default value of an argument, use
        my $arg = shift; $arg //= "default";
        لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
Re^2: Using the DATA file handle for ARGV
by aaron_baugher (Curate) on Nov 13, 2013 at 17:57 UTC

    The point of this is to replace *ARGV with *DATA so you can use the <> operator to read from the DATA filehandle instead of files named on the command line. So your input line should be:

    my $timestamp = <>;

    Aaron B.
    Available for small or large Perl jobs and *nix system administration; see my home node.