RosettaCodeData/Task/Random-sentence-from-book/Perl/random-sentence-from-book.pl
2023-07-01 13:44:08 -04:00

33 lines
883 B
Perl

#!/usr/bin/perl
use strict; # https://rosettacode.org/wiki/Random_sentence_from_book
use warnings;
my $book = do { local (@ARGV, $/) = 'waroftheworlds.txt'; <> };
my (%one, %two);
s/^.*?START OF THIS\N*\n//s, s/END OF THIS.*//s,
tr/a-zA-Z.!?/ /c, tr/ / /s for $book;
my $qr = qr/(\b\w+\b|[.!?])/;
$one{$1}{$2}++, $two{$1}{$2}{$3}++ while $book =~ /$qr(?= *$qr *$qr)/g;
sub weightedpick
{
my $href = shift;
my @weightedpick = map { ($_) x $href->{$_} } keys %$href;
$weightedpick[rand @weightedpick];
}
sub sentence
{
my @sentence = qw( . ! ? )[rand 3];
push @sentence, weightedpick( $one{ $sentence[0] } );
push @sentence, weightedpick( $two{ $sentence[-2] }{ $sentence[-1] } )
while $sentence[-1] =~ /\w/;
shift @sentence;
"@sentence\n\n" =~ s/\w\K (?=[st]\b)/'/gr =~ s/ (?=[.!?]\n)//r
=~ s/.{60,}?\K /\n/gr;
}
print sentence() for 1 .. 10;