First of all I'd just like to say that I think your code is really cool and that this program was a neat idea. I just made a few cosmetic changes to the code, please don't take any offense at this.
Things I Changed
- Made it so that it compiles with -w and use strict.
- Put an exit(0) command so that it doesn't print out 10 blank lines with the message if no arguments are supllied.
- Added code to check if $ARGV[1] is supplied so that it doesn't print a message about an empty regular-expression.
The (Slightly) Changed Code:
#!/usr/bin/perl -w
use strict;
my $numargs = scalar @ARGV;
if ($numargs == 0) {
print "Clare's Random Password Generator\n";
print "Usage: pwdgen template [number]\n";
print "where template is a string composed of the following ch
+aracters\n";
print "\tl\tlower case letter\n\tL\tupper case letter\n\tc\tlo
+wer case consonant\n\tC\tupper case consonant\n";
print "\tl\tlower case vowel\n\tL\tupper case vowel\n\tn\tnumb
+er\n\tp\tpunctuation mark\n\ta\tany character\n";
print "Any character in the template which is not one of those
+ above will be placed in the password at the same position\n";
print "number refers to the number of passwords to generate -
+this defaults to 10.\n";
exit(0);
}
my $num;
my $template = $ARGV[0];
if (defined $ARGV[1]) {
if ($ARGV[1] =~ /^\d+$/) {
$num = $ARGV[1];
}
}
else {
$num = 10;
} my @l = split '', 'qwertyuiopasdfghjklzxcvbnm';
my @n = split '', '0123456789';
my @p = split '', ',.?<>;:@/!"%^&*()-+=_';
my @L = split '', 'QWERTYUIOPASDFGHJKLZXCVBNM';
my @c = split '', 'qwrtypsdfghjklzxcvbnm';
my @C = split '', 'QWRTYPSDFGHJKLZXCVBNM';
my @v = split '', 'aeiou';
my @V = split '', 'AEIOU';
my @a = split '', 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBN
+M,.?<>;:@/!"%^&*()-+=_0123456789'; my @t = split '', $template;
my $len = scalar @t;
my $newpass = "";
for (my $c = 0; $c < $num; $c++) {
for (my $x = 0; $x < $len ; $x ++) {
if ($t[$x] eq "l") { $newpass .= $l[rand @l]; next;}
if ($t[$x] eq "L") { $newpass .= $L[rand @L]; next;}
if ($t[$x] eq "c") { $newpass .= $c[rand @c]; next;}
if ($t[$x] eq "C") { $newpass .= $C[rand @C]; next;}
if ($t[$x] eq "v") { $newpass .= $v[rand @v]; next;}
if ($t[$x] eq "V") { $newpass .= $V[rand @V]; next;}
if ($t[$x] eq "n") { $newpass .= $n[rand @n]; next;}
if ($t[$x] eq "p") { $newpass .= $p[rand @p]; next;}
if ($t[$x] eq "a") { $newpass .= $a[rand @a]; next;}
$newpass .= $t[$x];
}
print "$newpass\n";
$newpass = "";
}
-Ben Jacobs (dooberwah)
one thing i can tell you is you got to be free
http://dooberwah.perlmonk.org | [reply] [Watch: Dir/Any] [d/l] [select] |
Thank you - all good points.....
Clare
| [reply] [Watch: Dir/Any] |
Hi, just one thing ... line 11 needs to be revised as follows:
print "\tv\tlower case vowel\n\tV\tupper case vowel\n\tn\tnumb
+er\n\tp\tpunctuation mark\n\ta\tany character\n";
Otherwise your default ($numargs == 0) is showing "l" & "L" for vowels as well as letters.
Other than that ... I like this ... I'm keeping it!
So Long
blackstarr | [reply] [Watch: Dir/Any] [d/l] |
I liked your program, but IMHO you might want to make the password generator a subroutine that only runs if $template is defined. I'm running on a windows box at work, and I didn't get to see the instructions when the program prints 10 blank lines at the bottom. Also I'm sure everyone would agree on use strict and -w. Just a thought.
...... # your code
my $newpass = "";
sub make_passwords {
for ($c... # your for loop
}
&make_passwords if $template;
__________________________________________________
%mexnix = (email = > "mexnix@hotmail.com", website => "http://mexnix.perlmonk.org"); | [reply] [Watch: Dir/Any] [d/l] |