Perl - Use of uninitialized value?

46,620

Solution 1

Just check to see if $ARGV[0] is defined

#!/usr/bin/perl
use strict;
use warnings;

if(!defined $ARGV[0]){
    print "No FilePath Specified!\n";
}

This will print "No FilePath Specified!\n" if there was none passed command line.

The problem you are running into, is you are setting $filePath to an undefined value. Warnings is complaining because you've then tried to compare an undefined value to "". Warnings thinks that is worth telling you about.

I used my example to show a clean way of checking if something is defined, but technically for this, you could also just do:

if(!@ARGV){
    print "No FilePath Specified!\n";
}

Solution 2

Empty and uninitialized are not the same thing. You can check if a variable is initialized with the defined operator, like for example:

if ((!defined $filePath) || ($filePath eq "")) {
 # $filePath is either not initialized, or initialized but empty
 ...
}

I'm pretty sure you meant this:

my $filePath = $ARGV[0];

(without the quotes)

Solution 3

Alternative answer is to set a default value if it is not defined:

my $filePath = $ARGV[0] // '';
Share:
46,620

Related videos on Youtube

A Clockwork Orange
Author by

A Clockwork Orange

Updated on January 14, 2020

Comments

  • A Clockwork Orange
    A Clockwork Orange over 4 years

    So I'm trying to run this code...

    my $filePath = $ARGV['0'];
    if ($filePath eq ""){
        print "Missing argument!";
    }
    

    It should check the first command line argument, and tell me if its empty, but it returns this error and I can not figure out why:

    Use of uninitialized value $filePath in string eq at program.pl line 19.
    

    What am I doing wrong?

  • nobody
    nobody about 13 years
    Not 100% the same. That will treat the perfectly-legal filename "0" as false.
  • nobody
    nobody about 13 years
    The '||' option is not 100% the same. It will treat the perfectly-legal filename "0" as missing and provide the default instead.
  • ysth
    ysth about 13 years
    I like: if ( ! defined $filePath || ! length $filePath )

Related