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

rizzler has asked for the wisdom of the Perl Monks concerning the following question:

Hi monks,

I have a new problem I cant resolve, I found a nice piece of code on the internet and if I use it in its own small script it works well. The script just adds a header to an already created file. Unfortunately when I use it as part of my larger script I have an issue as @ARGV is used and in my larger script, I actually pass in some arguments. Is there a way to rewrite it so that @ARGV is not used

#/usr/bin/perl use strict; use warnings; sub addheader{ my($infile,$header)=@_; my $text = do { local( @ARGV, $/ ) = $infile ; <> } ; open(FILE,">$infile"); print FILE $header; print FILE $text; close FILE; } my $migfile = "SUBSCRPT_DATA_20121029_11001.DAT"; my $header= "44,,,2\n"; &addheader($migfile,$header);

The following line just hangs when I run the code in my larger script:

my $text = do { local( @ARGV, $/ ) = $infile ; <> } ;

As always, your help is much appreciated

Cheers,

Rizz

Replies are listed 'Best First'.
Re: unwanted ARGV in subroutine
by choroba (Cardinal) on Oct 29, 2012 at 21:48 UTC
    my $text = do { local( @ARGV, $/ ) = $infile ; <> } ;
    This should locally change @ARGV to contain $infile and load the whole file into $text. Maybe the file is huge and you have just to wait a bit?
    لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
      And if the file is huge, the OP shouldn't be loading it into memory, and should write to a temp file, and then rename it at the end.

        Hi rizzler

        Try this

        sub addheader{ my($infile,$header)=@_; open(FILE, "$infile"); my $text=do {local $/; <FILE>}; close FILE; open(FILE,">$infile"); print FILE $header; print FILE $text; close FILE; }
Re: unwanted ARGV in subroutine
by rizzler (Novice) on Oct 30, 2012 at 08:43 UTC

    Hi guys,

    perl_walker hit the nail on the head again. It works perfectly.

    Thanks a lot,

    Rizz

      sure, until it doesn't and you don't know why -- at least use autodie;