use strict; use warnings; my %h = ('a'=>'123','b'=>'xxx','c'=>''); my %newhash; for(keys %h){ $newhash{$_} = $h{$_} if $h{$_} ne '' }; print join(",", keys %newhash)."\n"; #### use strict; use warnings; my %h = ( 'a' => 'aaa', 'b' => '' ); for(keys %h){ next if $h{$_} eq ''; my $evalstr = "\$$_ = '$h{$_}';"; print "eval: $evalstr\n"; eval $evalstr; die "eval $@" if $@; } print "a=$a\n"; #### #!/usr/bin/env perl #use strict; use warnings; my %params = ( 'default-0' => ['lakja', 'haljl', 'alka'], 'default-1' => 'abc', 'default-2' => [1, 54, 83, 23], 'default-3' => [], 'default-4' => '', 'default-5' => '2019-06-26 00:00:10', ); my %cor = ( 'default-0' => '@arr_0', 'default-1' => '$scal_1', 'default-2' => '@arr_2', 'default-3' => '@arr_3', 'default-4' => '$scal_4', 'default-5' => '$date_5', # etc ); my $evalstr; for(keys %params){ my $varname = $cor{$_}; die "var not found for $_" unless defined $varname; if( $varname =~ /^\$/ ){ next if $params{$_} eq ''; # quote value because it's a string: very basic rule of thumb... $evalstr = "$varname = '$params{$_}';"; } elsif( $varname =~ /^@/ ){ next if @{$params{$_}}==0; $evalstr = "$varname = ".'@{["'.join('","',@{$params{$_}}).'"]};'; } else { die "can't handle $varname = ".$params{$_} } print "eval: $evalstr\n"; eval $evalstr; die "eval $@" if $@; } print '@arr_0='."@arr_0\n".'$scal_1='."$scal_1\n"; #### Possible unintended interpolation of @arr_0 in string at b.pl line 45. Name "main::arr_0" used only once: possible typo at b.pl line 45. Name "main::scal_1" used only once: possible typo at b.pl line 45. eval: @arr_0 = @{["lakja","haljl","alka"]}; eval: $date_5 = '2019-06-26 00:00:10'; eval: @arr_2 = @{["1","54","83","23"]}; eval: $scal_1 = 'abc'; @arr_0=lakja haljl alka $scal_1=abc