痔になりやすい生活習慣とは?

受け取った文字列を「数字 → アルファベット大文字 → 小文字」の順にマジカルインクリメントして返すようなサブルーチンを作りたいのですが、どのように実装すればよいのでしょうか?

通常のインクリメント演算子 (++) を使うと、数字ならば数字、大文字ならば大文字という規則でインクリメントされますが、それを拡張したいと思っています。

どなたか、大まかな手順のみでも構いませんので、ご教示いただければ幸いです。よろしくお願い致します。

OS: Windows XP
ActivePerl v5.10.0

このQ&Aに関連する最新のQ&A

A 回答 (1件)

引数を一度 split して文字に分解して, 文字ごとに処理していけばいい (もちろん最後に join する) んじゃないかなぁ?


例えば
sub magical_increment {
my @inputs = reverse split //, $_[0];
my $flag = 0;
for my $ch (@inputs) {
if ($ch =~ /[0-8A-Ya-y]/) {
$ch++;
$flag = 1;
last;
} elsif ($ch == '9') {
$ch = 'A';
$flag = 1;
last;
} elsif ($ch == 'Z') {
$ch = 'a';
$flag = 1;
last;
} else {
$ch = '0';
}
}
push @inputs, '1' unless $flag;
join '', reverse @inputs;
でできるかなぁ? もうちょっと賢くできるけど....
    • good
    • 0
この回答へのお礼

なるほど、文字ごとに分けて処理をしていけばよいのですね。
しかし、試してみたところ z の次が a になってしまうようです。

私も以下のようなコードを考えてみたのですが、繰り上がりが上手くいきません…と思っていたのですが、適当に書き直していたところ、偶然にも上手くいってしまいました。

sub inc{
    my $str = shift;

    if (substr($str, -1) eq '9') {
        substr($str, -1) = 'A';
    }

    elsif (substr($str, -1) eq 'Z') {
        substr($str, -1) = 'a';
    }

    elsif (substr($str, -1) eq 'z') {
        substr($str, -1) = '0';

        if (substr($str, -2, 1) eq '') {
            $str = "0$str";
        }

        else{
            substr($str, 0, -1) = inc(substr $str, 0, -1);
        }
    }

    else{
        $str++;
    }

    return $str;
}

自己解決しました。お手数お掛けして申し訳ありません。
ご回答有難うございました。

お礼日時:2008/03/09 21:36

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング