Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

Re: Using the DATA file handle for ARGV

by GotToBTru (Prior)
on Nov 13, 2013 at 17:16 UTC ( #1062420=note: print w/replies, xml ) Need Help??


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 (Archbishop) 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.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1062420]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (3)
As of 2021-04-17 17:46 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?