sironekotoroの日記

Perl で楽をしたい

かんたんPerl 第4章 リストと配列

リストと配列

  • 初心者本を何冊と繰り返してきたので、この辺りはなんとかこなせた。

マジックインクリメントで文字列の生成・・・に失敗

  • ただし、勝手に課題を見つけて寄り道しまくりで時間を取られるというパターン
  • 今回はマジックインクリメント
  • これで、ランダムな文字列を生成しようと試みるも失敗
    • rand関数は置いておく
use strict;
use warnings;
use 5.010;

    # マジックインクリメントで文字列を生成・・・例えば
    # a,b,c 〜 x,y,z,0,1,2 〜 7,8,9 〜 aa,ab,ac 〜 ax,ay,az,b0,b1 
    # 〜 z9,aaa,aab
    # ってのを作りたい!

    # いける
    say "a9".."b6"; # a9b0b1b2b3b4b5b6

    # とりあえず、文字からはじめてみる、ダメ
    say "a".."9"; # abcdefghijklmnopqrstuvwxyz

    # 数字からはじめてみる、ダメ
    say "0".."z"; # 0123456789

    # うーん
    # ただまぁ、文字をインクリメントしたら数字になるって考え方がおかしいよな
    my @array = ("A" , "Z");
    print ++$_ ," " for (@array); # B  AA

    # 文字列と数字の混ざったリストを作ろう
    my @words = ( ("a".."z") ,(0..9) );
    say @words; # abcdefghijklmnopqrstuvwxyz0123456789

    # その文字列の先頭と末尾でマジックインクリメントしてみたらどうか
    say $words[0]..$words[-1]
 Error : Argument "a" isn't numeric in range (or flop) at ~
    # だめだった
  • もちろん、マジックインクリメント使わず、力技で出来なくはない。
    • こうやって本来の勉強からそれてく
    • 再帰は苦手な人
use strict;
use warnings;
use 5.010;

my @words = ( ( "a" .. "z" ), ( 0 .. 9 ) );

foreach my $word0 (@words) {
    foreach my $word1 (@words) {
        foreach my $word2 (@words) {
            foreach my $word3 (@words) {
                foreach my $word4 (@words) {
                    say "$word1$word2$word3$word4"

                }
            }
        }
    }
  • きれいなピラミッドだなぁ
  • 4桁しかないのに、4桁の全パターン表示し終わるまで約1分、表示しなければ2秒
    • パスワードの桁数が多い方が良いし、文字列の種類も多い方が良いよなぁ、と実感。
    • パスワードクラックに使う辞書攻撃の辞書って、こうやって作られるんだろうなぁ
      • もちろん、今時は「あるもの」を使うんだろうけど