murugu has asked for the wisdom of the Perl Monks concerning the following question:

Hi monks,

I having an array which consist of the level values of the section in a book.

I want to generate the another array which will be based on the levels in the previous array.

Input:

@t=(0,1,1,2,3,2,1,2)

Here 0 means section 1, 1 means section 2, etc.

Output:

@out=(1, 1.a, 1.b, 1.b.1, 1.b.1.a, 1.b.2, 1.c, 2, 2.a, 2.a.1); In the output array i want even

@t=(0,1,1,2,3,2,1,0,1,2); $"='.'; my %h=( '1'=> 'a', '2'=> 'b', '3'=> 'c', '4'=> 'd', '5'=> 'e', '6'=> 'f', '7'=> 'g', '8'=> 'h', '9'=> 'i', '10'=> 'j', '11'=> 'k', '12'=> 'l', '13'=> 'm', '14'=> 'n', '15'=> 'o', '16'=> 'p', '17'=> 'q', '18'=> 'r'); my @s; foreach my $t (@t) { my $s; my @id=map{$s++;($s%2 == 0)?$h{$_}:$_}map{$#s=$_;++$s[$_];@s}$t; push(@out, "@id"); } print @out;

Even though Im getting the desired output. I dont want to use an hash which consist of alpahbetic values for corresponding numerals. Does it can be done with the help of chr function or any other way.

Many thanks in advance.

Replies are listed 'Best First'.
Re: array value generation for sections
by Zed_Lopez (Chaplain) on Jul 08, 2004 at 10:39 UTC
    Sure.
    sub number_to_letter { return chr(96+shift); }
    But the hash isn't a bad way to do it. You can make the assignment much simpler:
    my %h; @h{1..18} = 'a'..'r';
    Updated: fixed cut-and-paste-o whereby I had 'return' twice
      I am just wondering why you use return return. If I would be at home, with Perl installed on the computer, I would have tested. My guess is that is has something to do with references.
      But I'm at school. No Perl here. So would you be so kind to explain?




      "2b"||!"2b";$$_="the question"

        I think it is just a typo. It does compile OK with "return return" (which surprised me, actually) but it works just as well with just the one return.

        Update: If you consider that return EXPR is just an expression with the value EXPR, but with the added side effect of returning control to the caller of the sub, then it makes sense that you can put return as many times as you like. Including (in this case, since it's the last line of the sub) zero times.

        s^^unp(;75N=&9I<V@`ack(u,^;s|\(.+\`|"$`$'\"$&\"\)"|ee;/m.+h/&&print$&;
Re: array value generation for sections
by pbeckingham (Parson) on Jul 08, 2004 at 13:34 UTC