Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re: play with phone numbers & w perl :)

by CharlesClarkson (Curate)
on Dec 28, 2003 at 03:56 UTC ( #317273=note: print w/replies, xml ) Need Help??


in reply to play with phone numbers & w perl :)

First, bravo on the code. I really suck at writing recursive subs. I didn't intend to rewrite your code. I was just trying to rid it of global variables. Please don't take offense.

I don't like the idea of using @tab as a global. IMO, it would be better to use it as a private variable instead.

{ my @tab; sub teledecode { my $tocode = $_[0]; my @telecode = (); my $i = 0; foreach my $byte ( split //, $tocode ) { $telecode[$i] = $telear[$byte]; $i++; } @tab = (); return arrangecode( "", 0, @telecode ); } sub arrangecode { my ( $first, $i, @dat ) = @_; foreach my $j ( @{ $dat[$i] } ) { if ( $i < ( @dat - 1 ) ) { @tab = arrangecode( $first . $j, $i + 1, @dat ); } # I thnk it is faster written as # push @tab, $first . $j; else { $tab[@tab] = $first . $j; } } return @tab; } }

Now teledecode() is not using @tab globally, but @telear is still a global. We could suck it into this scope, but it is used to make %telealph. It would be nicer if we could condence teledecode() to one line. What if we use an array slice ...

sub teledecode { @tab = (); return arrangecode( '', 0, @telear[ split //, $_[0] ] ); }

Now we could move this array slice outside the sub.

foreach my $toto (@ARGV) { if ( $toto =~ /-d=(\d+)/ ) { # Perhaps a description of what that slice # is doing would help the code maintainer :) print foreach teledecode( @telear[ split //, $1 ] ); } elsif ( $toto =~ /-s=([a-zA-Z_]+)/ ) { print smstype($1); # typo fixed by b10m (thanks) } else { print telecode($toto); } } { my @tab; sub teledecode { @tab = (); return arrangecode( '', 0, @_ ); } sub arrangecode { my ( $first, $i, @dat ) = @_; foreach my $j ( @{ $dat[$i] } ) { if ( $i < ( @dat - 1 ) ) { @tab = arrangecode( $first . $j, $i + 1, @dat ); } else { push @tab, $first . $j; } } return @tab; } }

We could use a hash slice in place of telecode() as well. Removing the last global variable.

else { # This slice should probably explained. print join '', @telealph{ split //, uc( $toto ) }; }
HTH,
Charles

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://317273]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (9)
As of 2016-10-01 18:58 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    How many different varieties (color, size, etc) of socks do you have in your sock drawer?






    Results (6 votes). Check out past polls.