2

アルファベットの 26 文字を含むすべての可能な文字列に対して、長さが 3 または 4 単位の文字列を作成する次のスクリプトを作成しました。27番目のキャラクターを追加したいと思います。と呼びます?が、どれでも構いません。これをどうすればいいのか考えられません。どんな助けでも大歓迎です。

26文字を実行するコードは次のとおりです。

 #!/usr/bin/perl

 use 5.10.0;

 my $str = 'AAA';
 while ( $str ne 'ZZZZ' ) {
    say $str;
    $str++;
  }

数値を基数 27 に変換するにはどうすればよいですか?

4

3 に答える 3

3

perldoc perlop :

自動インクリメント演算子には、少し余分なビルトイン マジックがあります。数値変数、または数値コンテキストで使用されたことのある変数をインクリメントすると、通常のインクリメントが得られます。ただし、変数が設定されてから文字列コンテキストでのみ使用され、値が空の文字列ではなく、 pattern に一致する/^[a-zA-Z]*[0-9]*\z/場合、インクリメントは文字列として行われ、その範囲内の各文字がキャリー付きで保持されます。 …

Algorithm::Combinatoricsが救援に!

#!/usr/bin/env perl

use strict;
use warnings;
use feature 'say';

use Algorithm::Combinatorics qw(variations_with_repetition);

my $digits = ['A' .. 'Z', '?'];

print_sequence($digits, 3);

sub print_sequence {
    my ($digits, $n) = @_;

    my $it = variations_with_repetition($digits, $n);
    while (my $v = $it->next) {
        say join '', @$v;
    }

    return;
}
于 2013-02-21T18:03:21.667 に答える
1

別の解決策として、いくつかの for ループを使用して、ASCII 値を反復処理することができます。これは見栄えの良いスクリプトではありませんが、値を生成してくれます。必要な追加文字を印刷するように簡単に変更できます。

#!/usr/bin/perl

use strict; 
use warnings;
use 5.10.0;

my $str = 65;

my ($i, $j, $k, $l);
for ($i = $str; $i < 92; $i++) {
    for ($j = $str; $j < 92; $j++) {
        for ($k = $str; $k < 92; $k++) {
            say chr($i), chr($j), chr($k);
            for ($l = $str; $l < 92; $l++) {
                say chr($i), chr($j), chr($k), chr($l);
            }
        }
    }
}

ASCII テーブルのリファレンスは次のとおりです: http://www.asciitable.com/

于 2013-02-21T18:13:21.133 に答える
0

Perl の文字列のインクリメントは「魔法」です。残念ながら、これは反復するアルファベットを (簡単に) 拡張できないことを意味します。

問題を言い換えれば、この問題はかなり簡単に解決できます。

数値を基数 27 に変換するにはどうすればよいですか?

それを行うためのコードが「そこに」あります。数字は「a」~「z」、「?」の文字です。次に、カウンターをインクリメントし、各値を異なるベース/文字列に変換します。

于 2013-02-21T18:03:11.190 に答える