Quando você chama system () com mais de um arg, você está dizendo ao perl para passá-lo diretamente para uma das chamadas exec * (), então ele não será chamado com um shell. O shell é o que entende o redirecionamento de arquivos. Tente isto:
system("wget $url -Omy_folder/$date-$target.html --user-agent=$useragent >/dev/null 2>&1");
Observe que isso é tecnicamente menos seguro do que transmiti-lo diretamente para exec.
Para citações, use String :: ShellQuote ou apenas implemente a lógica:
sub sq {
my $str = shift;
if (!$str) {
$str = "''";
} else {
$str =~ s|'|'\''|g;
$str = "'$str'";
$str =~ s|^''||;
$str =~ s|''$||;
}
return($str);
}
$useragent = sq($useragent);
system("wget $url -Omy_folder/$date-$target.html --user-agent=$useragent >/dev/null 2>&1");
Além disso, para tornar isso um pouco mais sys-admin-y e um pouco menos programador-y, você considerou usar a opção -q para wget ao invés de saltar através dos aros de redirecionamento de shell / arquivo?