I have a script which, based on a number passed from the command line will create random numbers of varying lengths. The way the script is written I may get 0 more than once. As it is a hash, no matter how many times 0 shows up, it will only appear once in the hash with the last value assigned. This leaves me short on elements compared to the request.

In order to determine how short I'm trying to find out how many keys there are:

print "randList length: " . scalar keys %randList;

This has the strange habit of printing twice. If there are 18 elements I'll get 1818; 20 elements begets 2020.

Later in the script I assign the keys to an array. I attempted to do the same thing using

print "numList length: " . ($#numList + 1);

This also outputs the value twice. Interestingly, if I don't add one to it I get two numbers. If the length is 17 I get 1617. I've also tried scalar @numList with the same results.

What could I be doing wrong? Full script below:
#!/usr/bin/perl use warnings; use strict; use Lingua::JA::Numbers; my $converted = "converted_numbers.csv"; my $len = $ARGV[0]; my (@numList, @rom, @kana, @kanji, %randList); open(OUTFILE, ">$converted"); binmode OUTFILE, ":utf8"; for (my $i=0; $i<$ARGV[1]; $i++) { my $genlen = int rand($len); my $max = 1 . 0 x $genlen; my $num = int rand($max); $randList{$num} = 1; } print "randList length: " . (scalar keys %randList) . "\n"; foreach my $key (keys %randList) { push(@numList, $key); } print "Length randList: " . ($#numList + 1); for my $num (@numList){ my $jaRom = Lingua::JA::Numbers->new($num, {style=>'romaji'}); my $jaKana = Lingua::JA::Numbers->new($num, {style=>'hiragana'}); my $jaKanji = Lingua::JA::Numbers->new($num, {style=>'kanji'}); push(@rom, $jaRom); push(@kana, $jaKana); push(@kanji, $jaKanji); } my (@hyphens, @noHyphens); for my $strg (@rom){ @hyphens = Lingua::JA::Numbers::to_string($strg); for my $val (@hyphens){ $val =~ s/-//g; } push(@noHyphens, join(" ", @hyphens)); } @rom = @noHyphens; my $size = scalar @numList; foreach (my $i=0; $i<$size; $i++){ print OUTFILE $numList[$i] . "," . $rom[$i] . "," . $kana[$i] . ", +" . $kanji[$i] . "\n"; } close OUTFILE;

In reply to Bizarre hash/array [size,length,whatever-you-want-to-call-it] output by theillien1

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.