Flux de sortie en Perl: STDERR, STDOUT,

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.