Also, you could change your verification code to be somewhat more like this:
#!/usr/bin/perl
use strict;
use warnings;
use v5.10;
sub edit_file {
my $my_file = shift;
my $editor = $ENV{'EDITOR'} || 'vim';
system($editor, $my_file);
}
sub validate_file {
my ($my_file) = @_;
my $error;
open(MY_FILE, '<', $my_file) or die "Unable to open file [$my_file
+]: $!";
while(<MY_FILE>) {
chomp;
given ($_) {
print("Checking [$_]\n");
if (/^[^[:lower:]]/) { # Line does not start with a lowerc
+ase letter
$error = "$_ does not begin with a lower case letter";
}
if (/somethingorother/) {
$error = "$_ has somethingorother";
}
default {
# Line is ok
}
}
if ($error) {
$error = "At line [$.]: $error";
close( MY_FILE );
return $error; # Stop parsing the file after the first err
+or
}
}
close(MY_FILE);
return undef;
}
my $string = join( "\n", qw(howdy partner goodbye Friend saynora adios
+ Amigo) );
open(MY_FILE, '>', 'my_file.txt') or die "Can not open my_file.txt: $!
+";
print MY_FILE $string;
close(MY_FILE);
edit_file('my_file.txt');
my $error = 'Nothing went wrong';
while ($error) {
$error = validate_file('my_file.txt');
if ($error) {
print "Error validating file: $error\n";
print "Hit return to continue: ";
<STDIN>;
edit_file('my_file.txt');
}
}
print "File is ok\n";
This uses a given-when construct to allow you to easily add more checks. It also incorporates some of the suggestions mentioned by other monks.
The validation-loop has been moved out of
validate_file and the returnvalue of
validate_file has been used in a more descriptive matter.
Note that this relies on the truth and falsehood of the empty string (undef is false, empty string is false, nonempty string is true).