4

これはばかげた質問です。もっと複雑なものにこれが必要ですが、簡単にしましょう。

$i = quotemeta 'A';
$line =~ tr/a-z/$i-Z/;

これはばかげた置換です。これは小さな文字を大文字に変えるはずですが、私が試したことはうまくいきません。

さて、これは多くの混乱をもたらしたと思います。実際のコードは次のようになります。

$line =~ tr/A-Z/F-ZA-E/;

CaesersChiperalgorhytmである必要があります。これは、固定文字数で変更する場合は問題なく機能しますが、必要な数の文字数で変更できるように変数が必要です。しかし、私は評価されたThnxを出荷したい

PSまた、なぜs ///は範囲で機能しないのですか?

4

4 に答える 4

4

tr///を使用すると、変数ではなくリテラル文字のみを使用できることに注意してください。したがって、tr/a-z/$i-Z/機能しません。を使用する必要がありますtr/a-z/A-Z/perldoc perlopでは、補間またはその欠如についての詳細を読みtr///、説明を見つけることができます。

文字列を大文字に変換する方法は他にもありますが。uc関数、または正規表現エスケープシーケンス\U(大文字)と(小文字)を使用できます\L。例えば:

my $str = 'a';
my $uppercase = uc $str;

正規表現:

my $str = 'abcdef';
$str =~ s/([a-z]+)/\U$1/;  # $str is now 'ABCDEF'

tchristは、大文字と小文字の影響を受けるすべての文字を含む[a-z]ように書く必要があると指摘しています。\p{CWU}

アップデート:

ある種の動的エンコーディング機能を作成しようとしている場合は、引数を取り、文字を手動で移動するサブルーチンをお勧めします。

sub foo {
    my ($str, $num) = @_;  # num is how many characters to shift the alphabet
    my @in  = 'A' .. 'Z';
    my @out = @in[$num .. $#in, 0 .. $num-1];
    my %out = map { $in[$_] => $out[$_] } 0 .. $#in;
    $str =~ s#(.)# $out{$1} // $1 #eg;  # if key does not exist, use org
    return $str;
}

大文字と小文字が区別されることに注意してください。ただし、これを解決するために小文字のキーを追加できます。

于 2012-05-02T23:51:20.707 に答える
4

本当にtrが必要な場合は、evalを使用できます。

$i = quotemeta 'A'
eval("\$line =~ tr/a-z/$i-Z/;");
于 2012-05-02T23:56:51.043 に答える
2

残念ながら、あなたの例は良い例ではありません。演算子はtr(どちらの半分でも)可変補間を受け入れません。実際にを使用している場合はtr、に頼らない限り運が悪いですeval。これはお勧めできません。を使用していない場合はtr、実際のコードを表示して、何が起こっているかを確認し、より多くの提案を提供できるようにしてください。

アップデート

これはどう?

my %map;
@map{'A'..'Z'} = ('F'..'Z','A'..'E');
s/[A-Z]/$map{$&}/g;

それがまだ真実であるかどうかはわかりませんが$&、ひどいパフォーマンスのペナルティのために、かつては絶対に避けなければなりませんでした。あなたはとても簡単にそうすることができます:

s/([A-Z])/$map{$1}/g;
于 2012-05-02T23:56:11.277 に答える
0

trは変数では機能しません。代わりにs///(置換)を使用してください。

于 2012-05-02T23:51:43.820 に答える