"@{ $hash{$query} }" means "the array referenced by the reference stored in $hash{$query}". However, $hash{$query} does not contain a reference to an array. It contains the string "query".
If $hash{$query} is undefined and @{ $hash{$query} } is used as an lvalue (like when it's an argument to push), an array will automatically be created and a reference to that array will be stored in $hash{$query}. This is called autovivification.
Get rid of the line $hash{'query'}= $query; (to allow autovivification).
In reply to Re: Can't use string ("query") as an ARRAY ref error
by ikegami
in thread Can't use string ("query") as an ARRAY ref error
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |