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

I'm replacing @ARGV arguments with command-line switches in an existing program.   When the script contains this chunk, it works fine called as script.pl
my %file = ( in => 'switches.txt', ); @ARGV = $file{in}; chomp (@ARGV = <>); foreach my $nonsane (@ARGV) { chomp $nonsane; unless ($nonsane =~ (/^(\w|-|\.)+$/)) { print " Ack - $nonsane is an improperly formatted device name +.\n"; print " Only alphanumeric, underscore, dash and dot allowed.\ +n"; exit; } } print (" Specified target names all valid.\n");

But when this chunk is in place, it doesn't seem to properly read $file{in} into @targets, when called as script.pl --infile switches.txt.

use Getopt::Long; GetOptions( 'infile|i=s' => \$opt_infile, ); if (defined $opt_infile) { $file{in} = $opt_infile; (@targets = $file{in}); } foreach my $nonsane(@targets) { chomp $nonsane; unless ($nonsane =~ (/^(\w|-|\.)+$/)) { print " Ack - $nonsane is an improperly formatted device name +.\n"; print " Only alphanumeric, underscore, dash and dot allowed.\ +n"; exit; } } print (" Specified target names all valid.\n");

The latter fails, and gives the *filename* as $nonsane in the 'Ack' error.   They're both reading the same input file, which looks somewhat like this:   (plain-text file, one entry per line, IP address, hostname, or FQDN)
172.31.1.1
192.168.1.1
switchname
router.domain

I tried chomp'ing a few different ways, with no success.   Fellow monks, what might I be overlooking, misunderstanding, or misapplying?

Perl 5.00503 on Debian Linux
#!/usr/bin/perl -w
use strict;


    cheers,
    Don
    striving toward Perl Adept
    (it's pronounced "why-bick")

Replies are listed 'Best First'.
Re: replace @ARGV args with Getopt::Long switches
by geektron (Curate) on Apr 12, 2001 at 01:40 UTC
    if i'm reading this correctly, you're trying to use Getopt::Long to process your file for you, which it won't do.

    you still need to read the file into the script:

    untested

    open ( FILE, $file{in} ) or die "can't open it:$!\n"; my @targets = < FILE >; close FILE; foreach my $target ( @targets ) { #### processing }

    should do the trick

      Thanks, geektron - that was it!   Well, that or I forgot to use Do::WhatImean   ;^)

      Here's what ended up working:

      use Getopt::Long; GetOptions( 'infile|i=s' => \$opt_infile, ); if (defined $opt_infile) { $file{in} = $opt_infile; open (INFILE, "< $file{in}") or die "Error opening $file{in}: $!"; @targets = <INFILE>; close INFILE or die "Error closing $file{in}: $!"; } else { die "Input file not specified!"; } foreach my $nonsane(@targets) { chomp $nonsane; unless ($nonsane =~ (/^(\w|-|\.)+$/)) { print " $nonsane is an improperly formatted device name.\n"; print " Only alphanumeric, underscore, dash and dot allowed.\ +n"; print " Edit $file{in} to remove puctuation, blank lines and/ +or blank spaces.\n"; exit; } }

          cheers,
          Don
          striving toward Perl Adept
          (it's pronounced "why-bick")
        Minor point, ybiC and no mua-hahaha this time.

        Getopt::Long accepts all unique abreviations to the option, so you don't need to specify your synonym. See Getopt::Long for details, but these should work with 'infile=s'=>\$foo, 'bear=i'=>\$bar...:

        script.pl --infile Myfile -bear 666 script.pl -i Myfile -b 5
        Hope this helps,

        Jeroen
        "We are not alone"(FZ)