雑記2

テスト用の長い文字列を生成する。

my $length = 100;
join '',map {$_ % 10} (0..$length-1)

ランダム文字列を生成する

srand();
my @char = (a..z,A..Z,0..9);
my $length = 24;

方法1

my $random_str = eval((q{$char[int rand(@char)].}x$length).q{""});

方法2

my $random_str = eval(join(".",(q{$char[int rand(@char)]})x$length));

クロージャ→外側で定義された変数を内側で定義された関数から参照する必要がある場合、自動的に内側の関数内にその変数への参照が束縛される

sub range{
  my ($start,$end,$diff) = @_;
  my $i = 0;
  return sub{
    # この関数に$start,$end,$diff,$iが束縛される
    my $r = $start + ($i++) * $diff;
    if($r <= $end){
      return $r;
    }else{
      return undef;
    }
  }
}

# 初項0、公差3、最大値100の等差数列
my $range1 = range(0,100,3);
my $g;
while(defined($g = $range1->())){
  print "$g\n";
}

という風に使う。
実際にはループを書くのがめんどい場合の方が多いので、我ながら変態的だが

sub range{
  my ($start,$end,$diff,$func) = @_;
  $func = $func || sub{};
  for(my $i=$start;$i<$end;$i+=$diff){
    $func->($i);
  }
}

range(0,100,3,sub{print "$_[0]\n"})

というよな処理を記述することが多いなぁ。

どちらにしろ
細かい実装は下の階層に閉じこめ、上の階層では、
処理の方針のようなものを記述する方が良いと思う