#!/usr/bin/perl
use strict;
use warnings;
# Read in strings from a file and generate
# an interesting song/album/artist name
# File to get strings from
my $seed_file = $ARGV[0];
my @data = split("\n", `cat $seed_file`);
# Length of random name (in words)
my $length = int(1 + rand(4 - 1));
my @words;
sub word_from_seed() {
my $word = $data[ rand @data ];
chomp $word;
return $word;
}
sub get_word {
my $tmp_word = word_from_seed();
chomp $tmp_word;
my $final = "";
if ( $tmp_word =~ m/ / ) {
my @strings = split(" ", $tmp_word);
my $string = $strings[ rand @strings ];
$final = $string;
} elsif ( $tmp_word =~ m/\./ ) {
my @strings = split(".", $tmp_word);
my $string = $strings[ rand @strings ];
$final = $string;
} else {
$final = $tmp_word;
}
# Chance to splice
my $flip = 1 + int(rand(2));
if ( $flip == 1 || $length == 1 ) {
# Get word, take the first 3 chars,
# save in $splice_word
my $splice_word = word_from_seed();
if ( length $splice_word >= 3 ) {
if ( $splice_word =~ m/(^.{3})/ ) {
$splice_word = $1;
}
} else {
$splice_word =~ m/(^.{1})/;
$splice_word = $1;
}
# Get final word, take last $rand chars,
# add to splice_word
if ( ! defined $final || $final eq "" ) {
$final = word_from_seed();
}
my $splice_char_num = 1 + int(rand(length $final));
if ( $splice_char_num < 1 ) {
$splice_char_num = 1;
}
$final =~ m/(.{$splice_char_num}$)/;
my $splice_word_2 = $1;
$final = $splice_word . $splice_word_2;
}
return $final;
}
if ( defined $ARGV[1] && $ARGV[1] eq "--gen-seed" ) {
my @seed_words = ();
foreach my $i ( 1..10000 ) {
my $word = get_word();
push(@seed_words, $word);
}
my $word_list = join("\n", @seed_words);
open(my $fh, '>', "generated_seed.txt");
print $fh $word_list;
close $fh;
my $sorted_list = `cat generated_seed.txt | sort | uniq`;
open(my $fh2, '>', "generated_seed.txt");
print $fh2 $sorted_list;
close $fh2;
exit 0;
}
foreach my $word ( 1..$length ) {
push(@words, get_word());
}
my $output = "";
foreach my $word (@words){
if ( ! defined $word || $word eq "") {
next;
}
$output = $output . $word . " ";
}
print "$output\n";