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/
> 
> 


--
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to