外部入力値をファイル名としてファイルを open する場合は、 | がファイル名に含まれているとコマンドとして実行される。 sysopen を使えば、指定されたファイル名は特別な解釈はされずに open されるので 意図せず外部コマンドを実行されることはない sysopen(FH, $file, O_RDONLY); または、-f で予めファイルがあるかをチェックして open を使っても良いかも。