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


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