не может перебрать все, чтобы начать с самого начала, после того, как он показывает ваши результаты - PullRequest
0 голосов
/ 09 октября 2019

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

Я попытался поместить весь свой код в цикл до, и он не работал

use 5.18.0;
use warnings;
use strict;

print "Enter the name of the file: ";
my %count;
my $userinput = <>; #the name of the text file the user wants to read
chomp($userinput); #take out the new line comand

my $linenumb = $ARGV[1];
my $uniqcount = 0;
#opens the file if is readeable
open(FH, '<:encoding(UTF-8)', $userinput) or die "Could not open file '$userinput' $!";
print "Summary of file '$userinput': \n";
my ($lines, $wordnumber, $total) = (0, 0, 0);
my @words = ();
my $count =1;

while (my $line = <FH>) {
   $lines++;
   my @words = split (" ", $line);
   $wordnumber = @words;

   print "\n Line $lines : $wordnumber ";
   $total = $total+$wordnumber;
   $wordnumber++;

}
print "\nTotal no. of words in file are $total \n";




#my @uniq = uniq @words;
#print "Unique Names: " .scalar @uniq . "\n";
close(FH);

Ответы [ 2 ]

4 голосов
/ 09 октября 2019

Часто хорошая идея поместить сложные части вашего кода в подпрограммы, чтобы вы могли (временно) забыть, как работают детали, и сконцентрироваться на более широкой картине.

Я бы предложил, чтобы у вас было дваочевидные подпрограммы, которые можно назвать get_user_input() и process_file(). Помещение кода в подпрограммы может выглядеть следующим образом:

sub get_user_input {
  print "Enter the name of the file: ";

  my $userinput = <>; #the name of the text file the user wants to read

  chomp($userinput); #take out the new line comand

  return $userinput;
}

sub process_file {
  my ($file) = @_;

  #opens the file if is readeable
  # Note: Changed to using a lexical filehandle.
  # This will automatically be closed when the
  # lexical variable goes out of scope (i.e. at
  # the end of this subroutine).
  open(my $fh, '<:encoding(UTF-8)', $file)
    or die "Could not open file '$file' $!";

  print "Summary of file '$file': \n";

  # Removed $lines variable. We'll use the built-in
  # variable $. instead.
  # Moved declaration of $wordnumber inside the loop.
  # Removed @words and $count variables that aren't used.
  my $total = 0;

  # Removed $line variable. We'll use $_ instead.
  while (<$fh>) {
    # With no arguments, split() defaults to
    # behaving as split ' ', $_.
    # When assigned to a scalar, split() returns
    # the number of elements in the split list
    # (which is what we want here - we never actually
    # use the list of words).
    my $wordnumber = split;

    print "\n Line $. : $wordnumber ";
    # $x += $y is a shortcut for $x = $x + $y.
    $total += $wordnumber;
    $wordnumber++;
  }

  print "\nTotal no. of words in file are $total \n";
}

И затем вы можете соединить их вместе с кодом примерно так:

# Get the first filename from the user
my $filename = get_user_input();

# While the user hasn't typed 'q' to quit
while ($filename ne 'q') {
  # Process the file
  process_file($filename);
  # Get another filename from the user
  $filename = get_user_input();
}

Обновление: IЯ немного очистил подпрограмму process_file() и добавил комментарии об изменениях, которые я сделал.

0 голосов
/ 09 октября 2019

Обернуть все в бесконечный цикл и условно выпрыгнуть из него .

while () {
    my $prompt = …
    last if $prompt eq 'quit';
    … # file handling goes here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...