LINUX.ORG.RU

Генератор текста

 


0

1

Есть скрипт на перле он рабочий,поможите сделать так чтоб он и ещё выбирал строки из файла в рандомном порядке

#!/usr/bin/perl
use strict;



# Генерация текста
my $text =  '{1|2|3|4}';






for(1..5) {
   print text_morph($text)."\n";
}

sub text_morph {
   my $text = $_[0];
   my $save = "";
   while($save ne $text) {
     $save = $text;
     $text =~ s/\{([^\{\}]+)\}/text_select($1)/eg;
   }
   return $text;
}

sub text_select {
   my @text = split /\|/, $_[0];
   return $text[rand(@text)];
}

Так как строк в файле много мне нужно сделать чтоб после генерации выглядело так

добавлено из файла 1
добавлено из файла 2
добавлено из файла 3
добавлено из файла 4



Последнее исправление: iNdexoiD (всего исправлений: 3)

Ответ на: комментарий от aandrew002

мне нужно сюда занести переменную чтобы читалось ещё из txt файла

my $text =  '{1|2|3|4}';

после генерации результат был такой

добавлено из файла 1
добавлено из файла 2
добавлено из файла 3
добавлено из файла 4

iNdexoiD
() автор топика

Ничего не понятно. У тебя какой-то бессмысленный скрипт и неясно, какие строки и куда выводить. Опиши задачу более внятно.

shell-script ★★★★★
()

Выбор рандомных строк из файла

#!/usr/bin/env perl

use strict;
use warnings;
use feature 'say';
use Carp 'croak';
use Getopt::Long 'GetOptions';

## OPTIONS
## -----------------------------------------------------------------------------

my $OPTION_FILE    = ''; # Which file to read from
my $OPTION_N_LINES = 5;  # How many lines to generate

GetOptions(
    'file=s'  => \$OPTION_FILE,
    'lines=i' => \$OPTION_N_LINES,
) or croak 'Error in command line arguments';

## HELPERS
## -----------------------------------------------------------------------------

sub read_lines_from_file {
    my $file = shift;

    open my $fh, '<', $file
	   or croak "Can't open file $file: $!\n";

    my @lines;
    while (my $line = readline $fh) {
        chomp $line;
        push @lines, $line;
    }

    close $fh;

    # No lines at all? I need at least one.
    return ('') unless @lines;

    return @lines;
}

sub random_line_index {
    my $n_lines = shift;
    return int(rand $n_lines);
}

## MAIN
## -----------------------------------------------------------------------------

sub main {
    croak 'Give me a text file'
        unless -T $OPTION_FILE;

    croak 'Number of lines should be a positive number'
        if $OPTION_N_LINES < 1;

    my @lines   = read_lines_from_file $OPTION_FILE;
    my $n_lines = scalar @lines;

    for (1..$OPTION_N_LINES) {
        my $random_line_index = random_line_index $n_lines;
        my $random_line       = $lines[$random_line_index];
        say $random_line;
    }
}

main();

## README
## -----------------------------------------------------------------------------

=encoding utf8

=head1 NAME
    gen - Generate text from a file

=head1 SYNOPSIS
    $ gen --file file.txt --lines 5

=head1 DESCRIPTION
    L<Read on LOR|https://www.linux.org.ru/forum/general/13553196>

=cut

evbogdanov
()
Ответ на: Выбор рандомных строк из файла от evbogdanov

evbogdanov спасибо огромное за скрипт.

А можно ещё добавить в начале каждой строки была рандомная генерация такого вида {слово1|слово2|слово3} также как в первом моём скрипте.

iNdexoiD
() автор топика
Ответ на: комментарий от nihirash

) ну это для меня дебри,почитал инфу на тему конкатенацией строк но добавить это в скрипт не получится.

iNdexoiD
() автор топика
Ответ на: комментарий от iNdexoiD

На здоровье

#!/usr/bin/env perl

use strict;
use warnings;
use feature 'say';
use Carp 'croak';
use Getopt::Long 'GetOptions';

## OPTIONS
## -----------------------------------------------------------------------------

my $OPTION_FILE         = '';      # Which file to read from
my $OPTION_N_LINES      = 5;       # How many lines to generate
my $OPTION_RANDOM_WORDS = '1|2|3'; # Random '|'-separated words
                                   # to prefix each line

GetOptions(
    'file=s'  => \$OPTION_FILE,
    'lines=i' => \$OPTION_N_LINES,
    'words=s' => \$OPTION_RANDOM_WORDS,
) or croak 'Error in command line arguments';

## HELPERS
## -----------------------------------------------------------------------------

sub read_lines_from_file {
    my $file = shift;

    open my $fh, '<', $file
        or croak "Can't open file $file: $!\n";

    my @lines;
    while (my $line = readline $fh) {
        chomp $line;
        push @lines, $line;
    }

    close $fh;

    # No lines at all? I need at least one.
    return ('') unless @lines;

    return @lines;
}

sub random_element { $_[rand @_] }

## MAIN
## -----------------------------------------------------------------------------

sub main {
    croak 'Give me a text file'
        unless -T $OPTION_FILE;

    croak 'Number of lines should be a positive number'
        if $OPTION_N_LINES < 1;

    my @lines = read_lines_from_file $OPTION_FILE;
    my @words = split /\|/, $OPTION_RANDOM_WORDS;

    for (1..$OPTION_N_LINES) {
        my $random_word = random_element @words;
        my $random_line = random_element @lines;
        say "$random_word $random_line";
    }
}

main();

## README
## -----------------------------------------------------------------------------

=encoding utf8

=head1 NAME
    gen - Generate text from a file

=head1 SYNOPSIS
    $ gen --file file.txt --lines 5 --words '1|2|3'

=cut

evbogdanov
()
Ответ на: На здоровье от evbogdanov

Можете ещё поправить в скрипте,мне нужно чтоб работало как макрос {1|2|3} чтоб перед ним запись оставалась без изменения 'my_page {1|2|3}' числа рандомились а my_page не изменялось.

И чтоб слова которые при генерации будут выбираться из файла были первые вначале строк.

iNdexoiD
() автор топика
Ответ на: комментарий от iNdexoiD
#!/usr/bin/env perl

use strict;
use warnings;
use feature 'say';
use Carp 'croak';
use Getopt::Long 'GetOptions';

## OPTIONS
## -----------------------------------------------------------------------------

my $OPTION_FILE    = '';            # Which file to read from
my $OPTION_N_LINES = 5;             # How many lines to generate
my $OPTION_TEXT    = 'text{1|2|3}'; # Some text plus random '|'-separated words
                                    # to add at the end of each generated line

GetOptions(
    'file=s'  => \$OPTION_FILE,
    'lines=i' => \$OPTION_N_LINES,
    'text=s'  => \$OPTION_TEXT,
) or croak 'Error in command line arguments';

## HELPERS
## -----------------------------------------------------------------------------

sub read_lines_from_file {
    my $file = shift;

    open my $fh, '<', $file
        or croak "Can't open file $file: $!\n";

    my @lines;
    while (my $line = readline $fh) {
        chomp $line;
        push @lines, $line;
    }

    close $fh;

    # No lines at all? I need at least one.
    return ('') unless @lines;

    return @lines;
}

sub random_element { $_[rand @_] }

sub random_word { random_element( split /\|/, shift ) }

sub random_text {
    my $text = shift;

    $text =~ s|\{(.+?)\}|random_word($1)|eg;
    return $text;
}

## MAIN
## -----------------------------------------------------------------------------

sub main {
    croak 'Give me a text file'
        unless -T $OPTION_FILE;

    croak 'Number of lines should be a positive number'
        if $OPTION_N_LINES < 1;

    my @lines = read_lines_from_file $OPTION_FILE;

    for (1..$OPTION_N_LINES) {
        my $random_line = random_element @lines;
        my $random_text = random_text $OPTION_TEXT;
        say "$random_line$random_text";
    }
}

main();

## README
## -----------------------------------------------------------------------------

=encoding utf8

=head1 NAME
    gen - Generate text from a file

=head1 SYNOPSIS
    $ gen --file file.txt --lines 5 --text 'text{1|2|3}'

=cut

evbogdanov
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.