Эти две строки открывают файл 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
$