La cosa è un po' ingannevole. Non potete semplicemente scrivere il
comando così:
@ok = `grep @opzioni '$stringa_di_ricerca' @nomifile`;
Dal Perl 5.8.0, potete usare open() con più argomenti. Come nel caso
delle chiamate in formato lista a system() e ad exec(), non avviene
alcun escape da parte della shell.
open( GREP, "-|", 'grep', @opzioni, $stringa_di_ricerca, @nomifile );
chomp(@ok = );
close GREP;
Potete anche fare così:
my @ok = ();
if (open(GREP, "-|")) {
while () {
chomp;
push(@ok, $_);
}
close GREP;
} else {
exec 'grep', @opzioni, $stringa_di_ricerca, @nomifile;
}
Come con system(), non si ha un escape da parte della shell nemmeno utilizzando
exec() su una lista. Ulteriori esempi si possono trovare in
perlipc/"Safe Pipe Opens" ["Aperture Sicure di Pipe", NdT].
Notate che, se utilizzate Microsoft, non è possibile alcuna soluzione
a questo fastidioso problema. Anche se Perl ha la possibilità di
emulare fork(), non combinate comunque, poiché Microsoft non ha una
API del tipo argc/argv.
|