Perl - как избежать предупреждений о неинициализированных элементах массива? - PullRequest
0 голосов
/ 11 января 2011
#!/usr/bin/perl
use strict;
use warnings;

sub paragraph
{
open my $file, "<", "dict.txt" or die "$!";
my @words = <$file>;
close $file;

print "Number of lines:";
my $lines = <>;

print "Max words per line:";
my $range = <>;

for(my $i = 0; $i<$lines; $i++){
    my $wordcount = int(rand($range));

        for(my $s = 0; $s<=$wordcount; $s++){
            my $range2 = scalar(@words);
            my $word = int(rand($range2));
            print $words[$word]." ";

                if($s==$wordcount){
                    print "\n";}
                    }
                    }
                    }
paragraph;

Я пытаюсь научиться программированию, поэтому я только что написал этот простой скрипт.

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

Ответы [ 2 ]

3 голосов
/ 11 января 2011

Эти две строки открывают файл dict.txt для записи, а затем пытаются прочитать его.

open FILE, ">dict.txt" or die $!;
my @words = <FILE>;

Поскольку вы не можете читать из файла только для записи, произойдет сбой. Если файл был доступен для записи, то теперь он пуст - извините за ваш хороший список слов. Предложение:

open my $file, "<", "dict.txt" or die "$!";
my @words = <$file>;
close $file;

Также, пожалуйста, научитесь делать отступы в ортодоксальной форме, например:

sub go
{
    print "Number of lines:";
    my $lines = <>;
    print "Max words per line:";
    my $range = <>;
    for (my $i = 0; $i<$lines; $i++){
        my $wordcount = int(rand($range));
        for (my $s = 0; $s<$wordcount; $s++){
            my $range2 = 23496;
            my $word = int(rand($range2));
            my $chosen = @words[$word];
            print "$chosen ";
            if ($s=$wordcount){
                print "\n";
            }
        }
    }
}

Также оставьте пробел между «если» или «для» и открытыми скобками.

Ваше задание if ($s = $wordcount), вероятно, не то, что вы намеревались; однако условие if ($s == $wordcount) всегда будет ложным, поскольку оно входит в область действия цикла с условием $s < $wordcount. Вам нужно переосмыслить эту часть вашей логики.

В среднем вам следует выбрать более подходящее имя для вашей функции, чем go. Также, вероятно, лучше вызвать его как go();.


Когда я тестирую компиляцию вашего скрипта, Perl предупреждает о:

Scalar value @words[$word] better written as $words[$word] at xx.pl line 19.

Вы должны исправить такие ошибки перед публикацией.

У вас есть:

my $range2 = 23496;
my $word = int(rand($range2));

Если в вашем словаре нет более 23 496 слов, вы, скорее всего, получите доступ к неинициализированному слову. Вы, вероятно, должны использовать:

my $range2 = scalar(@words);

Тогда у вас останутся логические проблемы для решения.


Учитывая 'dict.txt', содержащий:

word1
word2
word3
word4
nibelung
abyssinia
tirade
pearl

И 'xx.pl', содержащий:

#!/usr/bin/env perl

use strict;
use warnings;

open my $file, "<", "dict.txt" or die $!;
my @words = <$file>;
close $file;

sub go
{
    print "Number of lines: ";
    my $lines = <>;
    print "Max words per line: ";
    my $range = <>;
    my $range2 = scalar(@words);
    for (1..$lines)
    {
        for (1..$range)
        {
            my $index = int(rand($range2));
            my $chosen = $words[$index];
            chomp $chosen;
            print "$chosen ";
        }
        print "\n";
    }
}

go();

Когда я запускаю его, я получаю:

$ perl xx.pl
Number of lines: 3
Max words per line: 4
word4 word3 word4 nibelung 
abyssinia pearl word1 tirade 
word3 word1 word3 word2 
$
1 голос
/ 11 января 2011

Еще несколько ошибок:

        if($s=$wordcount){

Вам нужно == здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...