Perl - entrée de Ligne de Commande & STDIN
j'ai donc créé ce script ci-dessous pour une tâche, j'ai, on me demande un fichier texte et vérifie la fréquence des mots et des listes de 10 mots qui apparaissent la plupart du temps. Tout fonctionne bien mais j'ai besoin de ce script pour être en mesure de démarrer via la ligne de commande ainsi que via l'entrée standard.
Donc j'ai besoin d'être en mesure d'écrire 'perl wfreq.pl example.txt" et qui devrait lancer le script et de ne pas poser la question pour un fichier texte. Je ne suis pas sûr de la façon de le faire vraiment, je pense que j'aurai besoin d'une boucle while au début quelque part qui saute le STDIN si vous lui donnez le fichier texte dans le Terminal en ligne de commande.
Quelqu'un qui peut l'aider?
#! /usr/bin/perl
use utf8;
use warnings;
print "Please enter the name of the file: \n" ;
$file = <STDIN>;
chop $file;
open(my $DATA, "<:utf8", $file) or die "Oops!!: $!";
binmode STDOUT, ":utf8";
while(<$DATA>) {
tr/A-Za-z//cs;
s/[;:()".,!?]//gio;
foreach $word (split(' ', lc $_)) {
$freq{$word}++;
}
}
foreach $word (sort { $freq{$b} <=> $freq{$a} } keys %freq) {
@fr = (@fr, $freq{$word});
@ord = (@ord, $word);
}
for ($v =0; $v < 10; $v++){
print " $fr[$v] | $ord[$v]\n";
}
OriginalL'auteur FictionFighter | 2011-10-24
Vous devez vous connecter pour publier un commentaire.
Vous avez pu lire STDIN seulement si un nom de fichier n'est pas fourni:
Ok j'ai mal compris la question, basée sur votre commentaire vous devez faire ce qui suit:
Si je dois le dire, l'utilisateur invites sont très non-unix.
Pas vraiment sûr de ce que je fais mal, mais je n'arrive pas à démarrer lors de juste dire "perl wfreq.pl" il n'demander le fichier en tant que STDIN mais il ne bouge pas que le long et de faire le tri et d'inscription.
ok j'ai mis à jour ma réponse, j'ai mal compris votre question.
Dave Sherohman de réponse est celui que vous devez utiliser. À l'aide de diamond
<>
opérateur est le chemin à parcourir.OriginalL'auteur
Au lieu de la lecture de
<STDIN>
, vous pouvez lire<>
pour obtenir des données à partir des fichiers fournis sur la ligne de commande ou à partir de l'entrée standard si aucun fichier.par exemple, avec le programme:
la commande
./script foo.txt
va lire et imprimer les lignes defoo.txt
, tandis que./script
par lui-même permettra de lire et d'imprimer les lignes à partir de stdin.OriginalL'auteur Dave Sherohman
L'utilisation de l'opérateur
<
passeinput.txt
àscript.pl
comme entrée standard. Vous pouvez donc ignorer l'interrogation pour le nom de fichier. Sinon, utilisez$ARGV[0]
ou similaire, sidefined
.Comme je l'ai dit, passer de l'interrogation pour le nom de fichier et juste de la boucle sur les
<>
dans lewhile
boucle.Est-il quelque chose (c'est à dire le nom d'un autre fichier) dans
input.txt
?C'est beaucoup plus compliqué qu'il doit être, honnêtement. Lire sur "perl standard d'entrée" sur votre moteur de recherche préféré.
Pas de l'entrée de texte composé de la liste de mots aléatoires qui doivent être comptés et enregistrés.
OriginalL'auteur Alex Reynolds
Ce que vous pouvez faire est de vérifier pour un argument de ligne de commande dans
@ARGV
, qui est du Perl tableau qui automatiquement l'accaparement des arguments de ligne de commande, et--si--processus d'eux (sinon continuer avec la participation deSTDIN
). Quelque chose comme:Notez que vous pouvez isoler le code pour le traitement du nom de fichier (c'est à dire l'ouverture de
DATA
, en passant par les lignes de compter les mots, etc) à une sous-routine que vous pouvez facilement appeler (avec peut-être un argument composé du nom du fichier) dans chaque branche du code.Oh, et assurez-vous que je suis clair sur ce point: toujours
use strict
et toujoursuse warnings
. Si vous ne le faites pas, vous êtes d'avoir des ennuis.OriginalL'auteur