Example:
for my $key ( keys %DNS_CSV_FILES){
for my $file (@$DNS_CSV_FILES{$key}){
print $file;
}
}
gives the error: Global symbol "$DNS_CSV_FILES" requires explicit package name (did you forget to declare "my $DNS_CSV_FILES"?) at dns.pl line 41. Execution of dns.pl aborted due to compilation errors.
while
for my $key ( keys %DNS_CSV_FILES){
for my $file (@{$DNS_CSV_FILES{$key}}){
print $file;
}
}
gives the desired output: file1.txtfile2.txt
CodePudding user response:
@$DNS_CSV_FILES is dereferencing $DNS_CSV_FILES as an array. You don't have a reference scalar named $DNS_CSV_FILES so this fails.
@{$DNS_CSV_FILES{$key}} is dereferencing $DNS_CSV_FILES{$key} as an array. $DNS_CSV_FILES{$key} is accessing a key on the %DNS_CSV_FILES hash.
CodePudding user response:
This
@$DNS_CSV_FILES{$key}
Will from the left side see an array sigil @ followed by a scalar $. This can only be the dereferencing of an array ref. Otherwise the @ is a syntax error. Despite you putting the hash notation at the end. It is a race condition, of sorts. So it will assume that what follows is a scalar, and not a hash value.
When you clarify by adding extra brackets, it becomes clear what is intended
@{ $DNS_CSV_FILES{$key} }
Whatever is inside @{ } must be an array ref, and $....{key} must be a hash value.
