Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
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


Comment on Re: play with phone numbers & w perl :)
Select or Download Code

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 pondering the Monastery: (9)
As of 2015-07-02 02:20 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (25 votes), past polls