Perl - ввод из командной строки и STDIN - PullRequest
3 голосов
/ 24 октября 2011

поэтому я создал этот скрипт ниже для моего назначения, он запрашивает текстовый файл и проверяет частоту слов и перечисляет 10 слов, которые появляются чаще всего.Все работает нормально, но мне нужно, чтобы этот сценарий мог запускаться через командную строку, а также через стандартный ввод.

Так что мне нужно иметь возможность написать 'perl wfreq.pl example.txt' иэто должно запустить скрипт, а не задавать вопрос для текстового файла.Я не уверен, как это сделать на самом деле, я думаю, что мне может понадобиться цикл while, который пропускает STDIN, если вы дадите ему текстовый файл в командной строке терминала.

Кто-нибудь может помочь?

#! /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";
}

Ответы [ 4 ]

8 голосов
/ 24 октября 2011

Вместо чтения из <STDIN> вы можете читать из <>, чтобы получить данные либо из файлов, предоставленных в командной строке, либо из stdin, если файлов нет.

Например, с помощью программы:

#!/usr/bin/env perl

while (<>) {
  print $_;
}

команда ./script foo.txt будет читать и печатать строки из foo.txt, тогда как ./script сама будет читать и печатать строки из стандартного ввода.

6 голосов
/ 24 октября 2011

Вы можете прочитать STDIN, только если имя файла не указано:

my $DATA;
my $filename = $ARGV[0];
if ($filename) {
    open($DATA, $filename) or die $!;
} else {
    $DATA = STDIN;
}

Хорошо, я неправильно понял вопрос, основываясь на вашем комментарии, вам нужно сделать следующее:

my $DATA;
my $filename = $ARGV[0];
unless ($filename) {
    print "Enter filename:\n";
    $filename = <STDIN>;
    chomp $filename;
}
open($DATA, $filename) or die $!;

Хотя я должен сказать, что пользовательские приглашения очень похожи на Unix.

0 голосов
/ 24 октября 2011
perl script.pl < input.txt

Использование оператора < передает input.txt в script.pl в качестве стандартного ввода. Затем вы можете пропустить запрос имени файла. В противном случае используйте $ARGV[0] или аналогичный, если defined.

0 голосов
/ 24 октября 2011

Что вы можете сделать, это проверить аргумент командной строки в @ARGV, который является массивом Perl, который автоматически захватывает аргументы командной строки и - если присутствует - обрабатывает их (в противном случае продолжите ввод с STDIN).Что-то вроде:

use utf8;
use strict;  #Don't ever forget this!  Always, always, ALWAYS use strict!
use warnings;

if(@ARGV)
{
  #Assume that the first command line argument is a file to be processed as in your original code.
  #You may or may not want to care if additional command line arguments are passed.  Up to you.
}
else
{
  #Ask for the filename and proceed as normal.
}

Обратите внимание, что вы можете выделить код для обработки имени файла (т. Е. Открытия DATA, прохождения строк, подсчета слов и т. Д.) В подпрограмму, котораяВы можете легко позвонить (возможно, с аргументом, состоящим из имени файла) в каждой ветви кода.

О, и чтобы убедиться, что мне ясно об этом: всегда use strict и всегда use warnings.Если нет, вы напрашиваетесь на неприятности.

...