Hello again,

I wasn't able to continue with the project I was working on way back in 
September, but I wanted to send a quick note to thank everyone (Andy Bach, Jim 
Gibson, Rob Dixon and Mike Flannigan) for their help. I apologize for not 
following up sooner. Hopefully I'll have some time to get back to it some day 
soon; I was a little optimistic in my planning.  Thanks again!

On Sep 4, 2013, at 10:55 PM, beginners-digest-h...@perl.org wrote:

> 
> beginners Digest 5 Sep 2013 03:55:27 -0000 Issue 4576
> 
> Topics (messages 123410 through 123433):
> 
> Re: Recursive Validation Function
>       123410 by: Andy Bach
>       123411 by: Jim Gibson
>       123412 by: Rob Dixon
>       123413 by: Rob Dixon
>       123427 by: Mike Flannigan
> 
> 
> ----------------------------------------------------------------------
> 
> From: Andy Bach <afb...@gmail.com>
> Date: September 2, 2013 8:43:59 PM CDT
> To: John Aten <welcome.to.eye.o.r...@gmail.com>
> Cc: "beginners@perl.org" <beginners@perl.org>
> Subject: Re: Recursive Validation Function
> 
> 
> 
> 
> On Monday, September 2, 2013, John Aten wrote:
>         my $valid_token = validate_tokens($token);
> 
> 
> Too bad it doesn't work! Even if I put in valid tokens on the first shot, 
> there are errors:
> 
> You're passing the token as a parameter to the sub but the is using $_ for 
> the match. You need to assign the parameter in the sub. They arrive on the 
> global @_ array; one idiom is
> sub validate_token {
>   my ($test_token) = @_;
>   
> This assigns the first passed parameter to test_token. The advantage being of 
> you add more params you can just insert a new var. in the LHS list:
>   my ($test_token, $empty_allowed, $cleanup) = @_;
> 
> Now use $test_token instead of $_
> 
>  
> 
> I am writing a script to rename files. The script prompts the user to enter 
> tokens which will comprise part of the file name. These are made of letters 
> and numbers separated by a dot, ie: R.3. The letters can be R, I or C, upper 
> or lowercase. The first number can be one through eight, and if it is a six 
> there can be an additional dot followed by a one or two. To make sure that I 
> don't make any mistakes when putting in these tokens, I have tried to write a 
> function to make sure that they are valid:
> 
> sub validate_tokens {
>         if ($_ !~ /^[ric]\.[1234578]$/i) {
>                 if ($_ !~ /^[ric]\.6(\.[1|2])?$/i) {
>                         print "Enter valid tokens: ";
>                         my $new_token = <STDIN>;
>                         chomp $new_token;
>                         validate_tokens($new_token);
>                         }
>                 }
>         return $_;
> }
> 
> 
> I'm calling it like this:
> 
>         print "Enter Tokens: ";
>         my $token = <STDIN>;
>         chomp $token;
>         my $valid_token = validate_tokens($token);
> 
> 
> Too bad it doesn't work! Even if I put in valid tokens on the first shot, 
> there are errors:
> 
> Use of uninitialized value $_ in pattern match (m//) at bulk.pl line 65, 
> <STDIN> line 3.
> Use of uninitialized value $_ in pattern match (m//) at bulk.pl line 66, 
> <STDIN> line 3.
> 
> Lines 65 and 66 are the ones with the two if statements, lines 2 and 3 of the 
> first code snippet above. Each time I run it, the <STDIN> line number in the 
> error message increases by one. The script goes into an infinite loop, 
> prompting for valid tokens, but even if valid ones are entered it continues. 
> What am I missing?
> --
> To unsubscribe, e-mail: beginners-unsubscr...@perl.org
> For additional commands, e-mail: beginners-h...@perl.org
> http://learn.perl.org/
> 
> 
> 
> 
> -- 
> 
> a
> 
> Andy Bach,
> afb...@gmail.com
> 608 658-1890 cell
> 608 261-5738 wk
> 
> 
> 
> From: Jim Gibson <jimsgib...@gmail.com>
> Date: September 3, 2013 12:56:16 AM CDT
> To: "begin >> Perl Beginners" <beginners@perl.org>
> Subject: Re: Recursive Validation Function
> 
> 
> 
> On Sep 2, 2013, at 6:23 PM, John Aten wrote:
> 
>> Hello all,
>> 
>> I am writing a script to rename files. The script prompts the user to enter 
>> tokens which will comprise part of the file name. These are made of letters 
>> and numbers separated by a dot, ie: R.3. The letters can be R, I or C, upper 
>> or lowercase. The first number can be one through eight, and if it is a six 
>> there can be an additional dot followed by a one or two. To make sure that I 
>> don't make any mistakes when putting in these tokens, I have tried to write 
>> a function to make sure that they are valid:
> 
> Use $_[0] instead of $_ or the other suggestions from Andy.
> 
>> 
>> sub validate_tokens {
>>      if ($_ !~ /^[ric]\.[1234578]$/i) {
>>              if ($_ !~ /^[ric]\.6(\.[1|2])?$/i) {
> 
> The '[1|2]' part of this regular expression is incorrect. Characters in a 
> character class do not need the pipe character for alternation. They are 
> already treated as alternates. This part should be '[12]'. Your pattern will 
> match the string 'r.6|'
> 
> You can combine the two regular expressions by using alternation and 
> non-capturing grouping (clustering):
> 
> if( $_[0] !~ /^[ric]\.(?:[1-578])|(?:6(\.[12])?)$/i ) {
>  ...
> 
> For readability, use the extended form and the more modern zero-width 
> assertions \A and \z:
> 
> if( $_[0] !~ m{ \A [ric] \. (?:[1-578]) | (?:6 (\.[12])? ) \z }ix ) {
>  ...
> 
>>                      print "Enter valid tokens: ";
>>                      my $new_token = <STDIN>;
>>                      chomp $new_token;
>>                      validate_tokens($new_token);
>>                      } 
>>              }
>>      return $_;
>> }
>> 
>> 
>> I'm calling it like this:
>> 
>>      print "Enter Tokens: ";
>>      my $token = <STDIN>;
>>      chomp $token;
>>      my $valid_token = validate_tokens($token);
>> 
>> 
>> Too bad it doesn't work! Even if I put in valid tokens on the first shot, 
>> there are errors:
>> 
>> Use of uninitialized value $_ in pattern match (m//) at bulk.pl line 65, 
>> <STDIN> line 3.
>> Use of uninitialized value $_ in pattern match (m//) at bulk.pl line 66, 
>> <STDIN> line 3.
>> 
>> Lines 65 and 66 are the ones with the two if statements, lines 2 and 3 of 
>> the first code snippet above. Each time I run it, the <STDIN> line number in 
>> the error message increases by one. The script goes into an infinite loop, 
>> prompting for valid tokens, but even if valid ones are entered it continues. 
>> What am I missing?
>> --
>> To unsubscribe, e-mail: beginners-unsubscr...@perl.org
>> For additional commands, e-mail: beginners-h...@perl.org
>> http://learn.perl.org/
>> 
>> 
> 
> 
> 
> 
> From: Rob Dixon <rob.di...@gmx.com>
> Date: September 3, 2013 3:32:26 AM CDT
> To: beginners@perl.org
> Cc: John Aten <welcome.to.eye.o.r...@gmail.com>
> Subject: Re: Recursive Validation Function
> 
> 
> On 03/09/2013 02:23, John Aten wrote:
>> Hello all,
>> 
>> I am writing a script to rename files. The script prompts the user
>> to enter tokens which will comprise part of the file name. These are
>> made of letters and numbers separated by a dot, ie: R.3. The
>> letters can be R, I or C, upper or lowercase. The first number can be
>> one through eight, and if it is a six there can be an additional dot
>> followed by a one or two. To make sure that I don't make any
>> mistakes when putting in these tokens, I have tried to write a
>> function to make sure that they are valid:
>> 
>> sub validate_tokens {
>>      if ($_ !~ /^[ric]\.[1234578]$/i) {
>>              if ($_ !~ /^[ric]\.6(\.[1|2])?$/i) {
>>                      print "Enter valid tokens: ";
>>                      my $new_token = <STDIN>;
>>                      chomp $new_token;
>>                      validate_tokens($new_token);
>>                      }
>>              }
>>      return $_;
>> }
>> 
>> 
>> I'm calling it like this:
>> 
>>      print "Enter Tokens: ";
>>      my $token = <STDIN>;
>>      chomp $token;
>>      my $valid_token = validate_tokens($token);
>> 
>> 
>> Too bad it doesn't work! Even if I put in valid tokens on the first shot, 
>> there are errors:
>> 
>> Use of uninitialized value $_ in pattern match (m//) at bulk.pl line 65, 
>> <STDIN> line 3.
>> Use of uninitialized value $_ in pattern match (m//) at bulk.pl line 66, 
>> <STDIN> line 3.
>> 
>> Lines 65 and 66 are the ones with the two if statements, lines 2 and
>> 3 of the first code snippet above. Each time I run it, the <STDIN>
>> line number in the error message increases by one. The script goes
>> into an infinite loop, prompting for valid tokens, but even if valid
>> ones are entered it continues. What am I missing?
> 
> As has been explained, the parameter to your subroutine is in @_. $_ could 
> contain anything, and clearly is undefined at this point.
> 
> It is also a misuse of recursion as it stands. You should use the subroutine 
> just for verification, and put a reprompt loop outside it.
> 
> Try this for your subroutine
> 
>    sub validate_tokens {
>      $_[0] =~ /^[ric]\.(?:6\.[12]|[1-8])$/i;
>    }
> 
> and call it like this
> 
>    my $token;
>    print "Enter Tokens: ";
>    while () {
>      $token = <STDIN>;
>      chomp $token;
>      last if validate_tokens($token);
>      print "Enter valid tokens: ";
>    }
> 
> HTH,
> 
> Rob
> 
> 
> 
> 
> From: Rob Dixon <rob.di...@gmx.com>
> Date: September 3, 2013 3:35:37 AM CDT
> To: Perl Beginners <beginners@perl.org>
> Cc: Jim Gibson <jimsgib...@gmail.com>
> Subject: Re: Recursive Validation Function
> 
> 
> On 03/09/2013 06:56, Jim Gibson wrote:
>> 
>> For readability, use the extended form and the more modern
>> zero-width  assertions \A and \z:
>> 
>> if ( $_[0] !~ m{ \A [ric] \. (?:[1-578]) | (?:6 (\.[12])? ) \z }ix ) {
> 
> Hi Jim
> 
> You have incorrect parentheses. Your regex matches
> 
>    \A [ric] \. (?:[1-578])
> 
> or
> 
>    (?:6 (\.[12])? ) \z
> 
> which isn't what is wanted at all!
> 
> Rob
> 
> 
> 
> From: Mike Flannigan <mikef...@att.net>
> Date: September 4, 2013 7:26:58 AM CDT
> To: beginners@perl.org
> Cc: welcome.to.eye.o.r...@gmail.com
> Subject: Re: Recursive Validation Function
> 
> 
> 
> On 9/2/2013 8:23 PM, John wrote:
>> 
>> Hello all,
>> 
>> I am writing a script to rename files. The script prompts the user to enter 
>> tokens which will comprise part of the file name. These are made of letters 
>> and numbers separated by a dot, ie: R.3. The letters can be R, I or C, upper 
>> or lowercase. The first number can be one through eight, and if it is a six 
>> there can be an additional dot followed by a one or two. To make sure that I 
>> don't make any mistakes when putting in these tokens, I have tried to write 
>> a function to make sure that they are valid:
>> 
>> sub validate_tokens {
>>      if ($_ !~ /^[ric]\.[1234578]$/i) {
>>              if ($_ !~ /^[ric]\.6(\.[1|2])?$/i) {
>>                      print "Enter valid tokens: ";
>>                      my $new_token = <STDIN>;
>>                      chomp $new_token;
>>                      validate_tokens($new_token);
>>                      } 
>>              }
>>      return $_;
>> }
>> 
>> 
>> I'm calling it like this:
>> 
>>      print "Enter Tokens: ";
>>      my $token = <STDIN>;
>>      chomp $token;
>>      my $valid_token = validate_tokens($token);
>> 
>> 
>> Too bad it doesn't work! Even if I put in valid tokens on the first shot, 
>> there are errors:
>> 
>> Use of uninitialized value $_ in pattern match (m//) at bulk.pl line 65, 
>> <STDIN> line 3.
>> Use of uninitialized value $_ in pattern match (m//) at bulk.pl line 66, 
>> <STDIN> line 3.
>> 
>> Lines 65 and 66 are the ones with the two if statements, lines 2 and 3 of 
>> the first code snippet above. Each time I run it, the <STDIN> line number in 
>> the error message increases by one. The script goes into an infinite loop, 
>> prompting for valid tokens, but even if valid ones are entered it continues. 
>> What am I missing?
> 
> Howdy.
> 
> In your subroutine replace "$_" with "$_[0]" in 
> 3 places.  Then it may still be broke, but it 
> will function better.
> 
> 
> Mike
> 
> 
> 
>  
>  
>  
> Mirabeau | MMS    Dr. C.J.K. van Aalstweg 8F 301, 1625 NV Hoorn
> +31(0)20-5950550  -    -  www.mirabeau.nl
> 
> 

Reply via email to