大文字と小文字の全ての組み合わせを表示

30分プログラム、その534。Loading... via http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_100
最初は文字列を文字のリストに展開したあと全組合せを再帰で計算しようとしたところ、ネストリストが面倒くさそうだったので止めて、文字列のリストで計算することにした。
うまくデータ構造を選ぶとconcatが要らなくなるのがPerlのリスト操作のいいところに違いない、たぶん。

使い方

$ perl upper_lower.pl perl
PERl
PErL
PErl
PeRL
PeRl
PerL
Perl
pERL
pERl
pErL
pErl
peRL
peRl
perL
perl

ソースコード

#! /usr/bin/perl
# -*- mode:perl; coding:utf-8 -*-
#
# upper_lower.pl -
#
# Copyright(C) 2009 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2009/02/24 22:03:03
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#

use strict;
use warnings;
use Data::Dumper;

sub head_tail($) {
    my ($s) = @_;
    (substr($s,0,1),substr($s,1,length($s)-1))
}

sub ul_perm(@){
    my ($s) = @_;
    if(!$s) {
	('');
    }else{
	my ($x,$xs) = head_tail($s);
	my @ys = &ul_perm($xs);
	my @upper = map { (uc $x) . $_ } @ys;
	my @lower = map { (lc $x) . $_ } @ys;
	(@upper,@lower);
    }
}

for my $arg (@ARGV){
    for (ul_perm($arg)){
	print $_,"\n";
    }
}