2010-09-24 9 views
0

Je suis assez nouveau pour la programmation Perl mais j'ai une bonne expérience avec linux. Disons que j'ai le code suivant:Comment mon programme Perl obtient-il une entrée standard sous Linux?

while(1) { 
     my $text = <STDIN>; 
     my $text1 = <STDIN>; 
     my $text2 = <STDIN>; 
} 

Maintenant, la question principale est: Est-ce que STDIN en Perl lire directement/dev/stdin sur une machine Linux ou dois-je à tuyau/dev/stdin au script Perl?

+1

Que s'est-il passé quand vous avez essayé? –

+0

Vouliez-vous demander ''/dev/console'? –

Répondre

2

Si vous ne donnez rien au script, il restera là à attendre que vous entriez quelque chose. Lorsque vous le faites, il sera mis en $text et le script continuera d'attendre que vous entriez quelque chose. Lorsque vous le faites, cela va dans $text1. Par la suite, le script attendra de nouveau que vous entriez quelque chose. Une fois cela fait, l'entrée ira dans $text2. Ensuite, le tout se répétera indéfiniment.

Si vous invoquez le script comme

$ script < input 

input est un fichier, le script lira les lignes du fichier similaire ci-dessus, puis, lorsque le flux est épuisé, va commencer à attribuer undef à chaque variable pour une période de temps infinie.

AFAIK, il n'y a pas le langage de programmation où la lecture de la poignée de fichier STDIN (ou stdin) prédéfini vous oblige à appeler votre programme:

$ script < /dev/stdin 
+2

La redirection de stdin vers stdin de l'exécutable est complètement redondante ou absurde. – mkb

+0

bien ce que Im essayant de faire est de lire l'entrée d'un balayage de carte magnétique, qui agit essentiellement comme un clavier, malheureusement je n'arrive pas à trouver le fichier/dev/INPUTDEVICE à lire directement, donc j'essaie d'autres options (STDIN) .. des suggestions? –

+0

Trouvez le '/ dev/INPUTDEVICE'. S'il s'agit d'un périphérique USB, connectez-le et regardez la sortie de 'dmesg' –

1

Il lit directement à partir du descripteur de fichier STDIN. Si vous exécutez ce script, il attendra simplement l'entrée; Si vous lui envoyez des données, il boucle en boucle jusqu'à ce que toutes les données soient consommées, puis attend toujours.

Vous pouvez changer cela à:

while (my $test = <STDIN>) { 
    # blah de blah 
} 

donc un EOF mettra fin à votre programme.

1

STDIN Perl est, par défaut, juste accroché à tout le descripteur de fichier d'entrée standard est. Au-delà de cela, Perl ne se soucie pas vraiment comment ou d'où proviennent les données. C'est la même chose pour Perl si vous lisez la sortie d'un tube, redirigez un fichier ou tapez interactivement sur le terminal.

Si vous vous souciez de chacune de ces situations et que vous souhaitez les traiter différemment, vous pouvez essayer différentes approches.

+0

Qu'est-ce que "le descripteur de fichier ERREUR standard" (souligné par moi-même) a à voir avec cela? –

+2

Eh bien, vous auriez pu corriger l'erreur au lieu de vous plaindre à ce sujet. L'édition est une caractéristique de base de StackOverflow :) –