[PLUG] Perl question

Matt Alexander m at pdxlug.org
Mon Jun 23 15:41:02 UTC 2003


Daaaaaaaammmmmmmmmn...   you're gooooooood!  Thanks, Colin!


Colin Kuskie said:
> On Mon, Jun 23, 2003 at 02:45:54PM -0700, Matt Alexander wrote:
>> I'm still learning my way around Perl...  Here's what I want to do...  I
>> have a file that contains long lines of gibberish and buried in each
>> line
>> is a phone number (xxx xxxx).  I would like to create an array that
>> holds
>> just the phone numbers.  So I think I should do something like this:
>>
>> $i = 0;
>> while (<INFILE>) {
>>    $phone[$i] = /\d\d\d \d\d\d\d/;
>>    $i++;
>> }
>>
>> This, of course, doesn't work...  Any suggestions?
>
> It all boils down to 1 line:
>
> $phone[$i] = /\d\d\d \d\d\d\d/;
>
> Here's what it does.
>
> // is the match operator.  By default it matches against $_ and it
> returns true for a match and false if it doesn't.  So in the end your
> array should hold a bunch of 1's and 0's, and the array index would
> be the which line the phone numbers could be found on.
>
> Here's what you'd like to do:
>
> @phone = ();
> while (<INFILE>) {
>   if (/\d\d\d \d\d\d\d/) {
>     push @phone, ""something"";
>   }
> }
>
> The push function treats @phone like a stack, and "pushes" the
> 2nd argument ""something"" onto the end of the array.
>
> perldoc -f push
>
> Array indexing is implicit, and there is a complementary function
> called pop, which removes elements from the end of the array.  There
> are also orthogonal functions, unshift and shift, for working with the
> beginning of the array so that you can create queues, FIFOs and LIFOs.
>
> But how do you get ""something"" to be the phone number?
>
> First, you must know how perl's regexen work.
>
> perldoc perlre
> perldoc perlop
>
> You use parentheses to grab data from a regex, and when using the match
> operator, if it's called in list context, then it returns all the data
> captured by parentheses:
>
> So here's the code:
>
> use strict;
> @phone = ();
> my $phone;
> while (<INFILE>) {
>   if (($phone) = /(\d\d\d \d\d\d\d)/) {
>     push @phone, $phone;
>   }
> }
>
> You could also do this using a little more cryptically with the
> $1, $2, variables. (again, perlop and perlre)
>
> use strict;
> @phone = ();
> while (<INFILE>) {
>   push @phone, $1 if /(\d\d\d \d\d\d\d)/;
> }
>
> But using the $1 will cost your code some speed, if that's a
> constraint.  Perl will let you constrain it just about any way you
> want.
>
> Colin
>
> _______________________________________________
> PLUG mailing list
> PLUG at lists.pdxlinux.org
> http://lists.pdxlinux.org/mailman/listinfo/plug
>





More information about the PLUG mailing list