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

Hi Monks, I'm trying to list all the values from %ENV, where if a key has no value, then it should print 'undefined value'.

my @max; foreach ( keys %ENV){ push @max, length $_; } my @sorted_max = sort { $a <=> $b } @max; my $max_num = pop @sorted_max; while ( my ($key, $value )= each %ENV) { $value = $value // 'undefined value'; printf "\n%-*s: %s", $max_num, $key, $value; }

I'm using defined-or operator to achieve this, but was unsuccessful. Thanks!

Replies are listed 'Best First'.
Re^2: not able to make defined-or operator work in my code (unsuccessful)
by Anonymous Monk on Feb 11, 2015 at 01:22 UTC

    I'm using defined-or operator to achieve this, but was unsuccessful. Thanks!

    Do you mean it does not work? what does it do? what does it not do?

Re^2: not able to make defined-or operator work in my code
by Anonymous Monk on Feb 11, 2015 at 01:24 UTC

    I guess it might have to do with the keys and values of %ENV being stringified, so perhaps that's why you're not seeing undef. A different criteria you could use might be $value = 'empty value' unless length $value;

        I don't see the OP assigning to %ENV. Are you able to get undefs from your environment? I'm genuinely curious, since I haven't yet been able to.

Re^2: not able to make defined-or operator work in my code
by Anonymous Monk on Feb 11, 2015 at 01:32 UTC
    For %ENV the key will not exist unless there is a value defined
      I did define a value.Like export hi=''. I'd expect it to be replaced by defined-or operator to 'undefined value'

        Set an environment variable, "PERL_MTYEST=''", and then run the following script:

        use feature qw/say/; say exists($ENV{PERL_MYTEST}) ? "exists" : "doesn't exist"; say defined($ENV{PERL_MYTEST}) ? "defined" : "undefined"; say length($ENV{PERL_MYTEST}) ? "non-zero length" : "zero length"; say "<<$ENV{PERL_MYTEST}>>";

        The output will be:

        exists defined zero length <<>>

        Which indicates that setting an environment variable to '' (an empty string) does not create an undefined variable, but rather, a defined variable with a value of zero length. Your assumption is just incorrect, that's all. Test for length.

        If you unset the environment variable in question, and then run the same test, you will get "doesn't exist", and "undefined".

        I suppose it's possible that your mileage will vary depending on operating system, but I don't know what OS would do it differently.


        Dave

        I did define a value.
        Yes, you did.

        You defined a value.

        That is why the value is not undefined.

        The value you defined happens to be an empty string, but an empty string is still a defined value.