Je connais les stream de sortie STDOUT et STDERR. Chaque fois que vous imprimez sur STDOUT, dans un shell unix, vous pouvez redirect la sortie comme ceci …
deviolog@home:~$ perl test_script.pl > output.txt
ou
deviolog@home:~$ perl test_script.pl 1> output.txt
Lorsque vous imprimez sur STDERR, le résultat est identique, mais vous passez à “channel” (?) Numéro 2:
deviolog@home:~$ perl test_script.pl 2> output.txt
Je peux trouver dans output.txt ce que j’imprimais en tant que sortie d’erreur.
Ma question est la suivante: puis-je accéder au “canal” numéro 3 d’une manière ou d’une autre? Y a-t-il quelque chose comme …
print STDX "Hello World!\n";
… qui permet une redirection comme la suivante?
deviolog@home:~$ perl test_script.pl 3> output.txt
ps Une sous-question concernerait le terme pour ces “canaux” ^ _ ^
Vous pouvez créer un descripteur de fichier Perl pour un descripteur de fichier ouvert (fd) en utilisant open
, en ajoutant &=
au mode et en utilisant le descripteur de fichier comme nom de fichier. Dans votre cas, vous utiliseriez ce qui suit:
open(my $fh, '>&=', 3)
Par exemple,
$ perl -E' open(my $fh, ">&=", 3) or die $!; say fileno($fh); say $fh "meow"; ' 3>output.txt 3 $ cat output.txt meow
> file
ou 2> file
s’appelle la redirection d’E / S , ces nombres tels que 2
sont des descripteurs de fichier .
En Perl, STDIN
est une entrée standard, correspondant au descripteur de fichier 1, STDOUT
et STDOUT
correspondant au descripteur de fichier 2 et 3, respectivement. Il n’y a pas de STDX
pour les autres descripteurs de fichiers. Mais vous pouvez utiliser la méthode suivante pour ouvrir les descripteurs de fichiers correspondant à d’autres descripteurs de fichiers (voir open
):
open my $fh, ">&", 3; # $fh will correspond to fd 3, for write
ou
open my $fh, ">&=", 3; # $fh will correspond to fd 3, for write
Et vous devez ouvrir le descripteur de fichier 3 (pour write) avant de lancer votre programme perl:
perl script.pl 3> file
Après cela, les sorties générées par des instructions telles que print $fh ...
apparaîtront dans le file
.
Non, car aucun système d’exploitation que je connais n’offre un troisième handle par défaut pour les programmes de console. * nix et Windows fournissent tous deux stdin, stdout et stderr (0, 1, 2). Celles-ci sont automatiquement fournies à un programme pour lui permettre de saisir et d’écrire dans la console une sortie normale tamponnée ou anormale (erreur).
Donc, comme indiqué dans d’autres réponses, vous pouvez appeler open()
pour ouvrir une poignée et la forcer à fd 3, mais pourquoi s’en préoccuper? C’est non standard, un peu inutile, et les gens vont s’interroger sur vous.
Utilisez simplement open()
pour ouvrir le fichier sur lequel vous souhaitez écrire.