Hi Edward!

On Tue, 28 Sep 2004 18:51:12 +0800, Edward Wijaya
<[EMAIL PROTECTED]> wrote:
> Hi,
> Why my code below fail to open and
> print the file contents
> 
> when I do:
> 
> perl mycode.pl -f filename
> 
> Regards,
> Edward WIJAYA
> SINGAPORE
> 
> __BEGIN__
> use strict;
> use warnings;

  Good Start!  Those pragmas above are very helpful!

> 
> use Getopt::Std;
> use vars qw($f);

  The above is good, but is now obsolete.  The preferred method is to
use 'our' declarations
  Also, the 'getopts()' function creates variables of the form 'opt_*'
where '*' is replaced with
  your option name.  So, for example, you should have declared opt_f here:

our $opt_f;

> getopts('f:');
> 
> my      $f = $ARGV[0];
> open ( INFILE, '<', $f)
>      or die "$0 : failed to open input file $f : $!\n";
  
  This is good, I especially like the 'die' statement in case it
fails.  Good Job!  It is relevant
  to note that opening a file to read is default, so the '<' was not
necessary.  However, it is
  nice to make it obvious which way you are opening the file (read
only, write, or etc.).  I
  might have written this as follows:

open INFILE, "<$opt_f" or die "$0: failed to open input file $opt_f: $!";

> close ( INFILE );
> 
  Why are you closing the file you just opened?  Maybe it's because
you don't understand
  the diamond ('<>') operator.  The diamond operator will read the end
of you command line
  and open each filename it finds there for processing.  It allows you
to write a Perl script
  that acts like any other UNIX process (e.g. cat, grep, etc ... ). 
In your code example,
  it appears as if you are trying NOT to use the diamond operator and
force your user
  to input a single filename with the '-f' option.  If this is the
case, you don't want to close
  your 'INFILE' above until after you've used it!  Like this:

while( <INFILE> ) {
    print;
}

> while ( <> )
> {
>      print $_;

  Inside this block, the '$_' variable is default and will be assigned
the next line from
  the file that 'while' is processing.  Because it is default, it is
not necessary.

> }
> __END__
> 
> --
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> <http://learn.perl.org/> <http://learn.perl.org/first-response>
> 
> 

Edward, I could write this script two ways.  The first is the way I
prefer and it doesn't use 'Getopt::Std' at all:

#!/usr/bin/perl

use warnings;
use strict;

while( <> ) {
    print;
}

That code above uses the diamond operator correctly.  The diamond
('<>') operator reads the command line and processes each file name on
the command line after your command!  So, in a command called
'perl_cat.pl' with a command line like:
  # perl_cat.pl foo.txt bar.txt
The diamond operator will first open foo.txt (processed in the while
loop) and print each line, then, open bar.txt and print each of it's
lines!

However, if you are really trying to use the 'Getopt::Std' module, I'd
do it like this:

#!/usr/bin/perl

use warnings;
use strict;

our $opt_f;
getopts( 'f:' );

open INFILE, "<$opt_f" or die "$0:  Can't open file $opt_f: $!";

while( <INFILE> ) {
    print;
}

In the above code, unlike yours, I don't 'close' INFILE.  That's
because Perl will close it for me at the end of my code.

I hope this helps!

--Errin

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to