in reply to
Access variable names
It is not possible to know the variable name of the variable passed into the subroutine, you need to tell it the name of the varaibles.
Just a minor modification to your code will make it work - just pass in the variable name in csv format.
#!/usr/bin/perl
use strict;
use warnings;
sub defnz {
my @names = split /,/, shift;
my %vars;
@vars{@names} = @_;
for my $item (@names) {
if (!defined($vars{$item})) {
print STDERR "$item is not defined\n";
return;
} elsif ($vars{$item} eq '') {
print STDERR "$item is empty\n";
return;
}
}
print STDOUT "All scalars defined and non-empty\n";
return 1; # all items in list defined and non-empty
}
my ($foo,$bar,$baz) = ("FOO","BAR","BAZ");
defnz('$foo,$bar,$baz', $foo,$bar,$baz);
($foo,$bar,$baz) = ("FOO","BAR","");
defnz('$foo,$bar,$baz', $foo,$bar,$baz);
($foo,$bar,$baz) = ("FOO",undef,"");
defnz('$foo,$bar,$baz', $foo,$bar,$baz);
__END__
output is:
All scalars defined and non-empty
$baz is empty
$bar is not defined
Simpler still, you can use
Data::Dumper to inspect the variables.
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
sub defnz {
my @names = split /,/, shift;
my %vars;
@vars{@names} = @_;
for my $item (@names) {
if (!defined($vars{$item}) || $vars{$item} eq '') {
print STDERR Dumper(\%vars);
return;
}
}
print STDOUT "All scalars defined and non-empty\n";
return 1; # all items in list defined and non-empty
}
my ($foo,$bar,$baz) = ("FOO","BAR","BAZ");
defnz('$foo,$bar,$baz', $foo,$bar,$baz);
($foo,$bar,$baz) = ("FOO","BAR","");
defnz('$foo,$bar,$baz', $foo,$bar,$baz);
($foo,$bar,$baz) = ("FOO",undef,"");
defnz('$foo,$bar,$baz', $foo,$bar,$baz);
__END__
output:
All scalars defined and non-empty
$VAR1 = {
'$foo' => 'FOO',
'$baz' => '',
'$bar' => 'BAR'
};
$VAR1 = {
'$foo' => 'FOO',
'$baz' => '',
'$bar' => undef
};