Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

少なくとも4種類入ったパスワードを作成

要件定義

以下の種類が少なくとも1文字は存在するパスワードを作成する。

  • 英大文字
  • 英小文字
  • 数字
  • 記号(!,#,$,%,&,@,?,*,+,-)

実装

MyPassword.pm
package MyPassword;
use strict;
use warnings;

my $DEFAULT_PASSWORD_LENGTH = 8;

my @c = ('a'..'z'); # lower case
my @C = ('A'..'Z'); # UPPER CASE
my @d = ('0'..'9'); # a digit
my @sym = ('!','#','$','%','&','@','?','*','+','-'); # symbol
my $_qr_sym_join = join(q{}, @sym);

my %qr = (
  c   => qr/[a-z]/,
  C   => qr/[A-Z]/,
  d   => qr/\d/,
  sym => qr/[$_qr_sym_join]/,
);

my @passowrd_character_elements = (@c, @C, @d, @sym);

sub create {
  my $len = shift || $DEFAULT_PASSWORD_LENGTH;

  MAKE_PASSWORD:
  while (1) {
    my $pw;
    $pw .= $passowrd_character_elements[int(rand(@passowrd_character_elements))]
      for 1 .. $len;

    # require all type char
    unless (     $pw =~ $qr{c} and $pw =~ $qr{C}
             and $pw =~ $qr{d} and $pw =~ $qr{sym})
    {
      redo MAKE_PASSWORD;
    }

    return $pw;
  }
}
1;

確認

$ perl -MMyPassword -E 'say MyPassword::create()'
Dqo2#knC