http://qs321.pair.com?node_id=1081242


in reply to Re: Use of uninitialized value $_ in string
in thread Use of uninitialized value $_ in string

Hi frozenwithjoy,

Yes, the line 32 is my $conf = "$_";. I've managed to remove the errors but I'm not so sure if this is the correct approach especially the declaration of the same variables under sub add_vhost. What I did was...

remove these variables from above:

my $conf = "$_"; my $conf_bn = basename($conf); my $conf_mtime = (stat($conf))[9]; my $date = strftime '%m%d%Y', localtime; my $backup = "$conf.$date"; my $backup_bn = basename("$conf.$date"); my $ltime = localtime();

then declared the $conf, $conf_bn, and $ltime variables under sub add_vhost.

sub add_vhost { my $conf; my $conf_bn; my $ltime;

and removed the comments from the variables under foreach...

foreach (@object) { my $conf = "$_"; my $conf_bn = basename($conf); my $conf_mtime = (stat($conf))[9]; my $date = strftime '%m%d%Y', localtime; my $backup = "$conf.$date"; my $backup_bn = basename("$conf.$date"); my $ltime = localtime();

The errors were gone every time I execute the script. However, after providing two required arguments, the script still does nothing. I was expecting it would start creating a backup of the existing file.

[root@wsprod01 myperl]# ./test.pl --domain google.com --client google Usage: ./test.pl --domain companydomain.com --client company [--job-co +de 12345] [--help].

Cheers,

JP

Replies are listed 'Best First'.
Re^3: Use of uninitialized value $_ in string
by AnomalousMonk (Bishop) on Apr 05, 2014 at 15:15 UTC
    ... the script still does nothing.
    [root@wsprod01 myperl]# ./test.pl --domain google.com --client google Usage: ./test.pl --domain companydomain.com --client company [--job-co +de 12345] [--help].

    In the code shown in the OP, in the statement

    GetOptions ( 'domain=s' => \$domain, 'client=s' => \$client, 'job-code:i' => \$job_code, 'help' => &usage() ) or &usage();
    the  'help' key is given the value of whatever is returned by a call to the  usage() function. Problem is, this function returns nothing; rather, it calls die to print a usage message, so program execution will never get past the  GetOptions() function call. Is this what you intend?

    Updates:

    1. If you want to assign the  'help' key a reference to the  usage() function,
          'help' => \&usage,
      would be the correct expression.
    2. Added italic emphasis in "... a call to the  usage() function."

      Hi AnomalousMonk,

      Thanks for pointing it out. Yes, I admit I missed adding the backslash before the &usage(). The script works fine as of now but I'm still trying to improve its features and hopefully I don't get new errors. :)

      Thanks a lot for the help!

      Cheers,

      JP

        ... adding the backslash before the &usage().

        I'm sure you understand this, but just in case...

        Just adding a backslash in front of a subroutine invocation will cause a reference to be taken to whatever the subroutine happens to return when invoked.

        c:\@Work\Perl\monks>perl -wMstrict -MData::Dump -le "sub S { return uc $_[0]; } ;; my %hash = ( 'x' => \&S('foo'), 'y' => \S('bar') ); dd \%hash; " { x => \"FOO", y => \"BAR" }

        Of course, the correct expression for assigning a code reference to a hash key would be
            'help' => \&usage,

        (Also, it's better practice to invoke subroutines without the  & sigil due to certain occasional, unexpected side-effects. So rather than
            my $x = &function('argument', 'list');
        it's better to write
            my $x = function('argument', 'list');
        instead, thus preserving use of  & for taking code references and for those odd function invocation cases in which its use is critical. See perlsub.)

      I suspect that is what's intended AnomalousMonk - I've yet to write/encounter a script or command that generates usage/help ... and then proceeds onwards.

      A user level that continues to overstate my experience :-))

        But the problem I see is not so much with what happens when the  usage() function is called as with the initialization of the  'help' key when the  GetOptions() function is called.  usage() is called during this initialization, so script execution never gets beyond the  GetOptions() call.