我不斷收到以下錯誤:
arg 1 到鍵的型別必須是散列(不是散列元素)
在這一行:
my $command = join(" ", @{$jparams{args}})
. " -cp " . $jparams{cp}
. " " . $jparams{class}
. " " . join(" ",
map {
${_} . "=" . qq|"$jparams{params}{$_}"|
} keys $jparams{params}
);
該錯誤顯示在 Perl 5.10 但不是 Perl 5.16。如何讓它在兩個版本中都能正常作業?
uj5u.com熱心網友回復:
keys $jparams{params}
應該
keys %{ $jparams{params} }
您的代碼存在代碼注入錯誤。
如果命令傳遞給system(or exec),請使用其多引數形式。
my @command = (
@{ $jparams{ args } },
-cp => $jparams{ cp },
$jparams{ class },
map { "$_=$jparams{ params }{ $_ }" }
keys %{ $jparams{ params } },
);
system { $command[0] } @command;
這不僅可以解決問題,還可以避免不必要地生成 shell。
但是如果你出于某種原因確實需要一個 shell 命令,你的代碼注入錯誤可以使用String::ShellQuote來解決shell_quote。
my @command = (
@{ $jparams{ args } },
-cp => $jparams{ cp },
$jparams{ class },
map { "$_=$jparams{ params }{ $_ }" }
keys %{ $jparams{ params } },
);
my $command = shell_quote( @command );
uj5u.com熱心網友回復:
在Perl 5.14keys之前,您無法傳遞對的參考,但在5.20中成為“實驗性”警告。
您可以通過取消參考 hashref 來解決此問題:
keys %{ $jparams{params} }
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/475686.html
標籤:perl
下一篇:如何在偶數和奇數之間交替?
