簡體   English   中英

perl替換字符串中的字符,但保留特殊字符或空格

[英]perl replace characters in a string but retain special character or space

我想創建一個替換字符並保留特殊字符的程序。 輸入和輸出示例如下所示。

這是我到目前為止所做的:

$sentence = userinput;

@words = split(/ /, $sentence);

for ($i = 0; $i < @words.length; $i ++){
    $words[$i] =~ s/\W//g;
    @characters = split(//, $words[$i]);
    #print $words[$i] . "\n";

    $wordlength = length($words[$i]);


    for ($j = 0; $j < @characters.length; $j ++){

    $char = $characters[$j];

    for ($x = 0; $x < $wordlength; $x++){
        $char++;
        if ($char eq "aa"){
            $char = "a";
        }
        elsif ($char eq "AA"){
            $char = "A";
        }
    }
    print $char;
    if ($x = 0){
        $output[$i] = $char;
    }
    else {
        $output[$i] = join ($char);
    }
}

print $output[$i];
}

輸入:

嗨! 你好嗎?

輸出:

k! krz duh brx itnsl?

代碼中的幾件事沒有意義:

  • 缺少use strict; use warnings; use strict; use warnings;
  • 所有變量都是全局變量(您應該使用my來創建變量)
  • @foo.length不是數組@foo的元素數。 它是@foo數組中的元素數與$_的字符數串聯在一起(因為標量上下文中的數組返回其長度, .連接字符串,並且默認情況下length$_上起作用)。
  • join ($char)始終返回空字符串:您正在使用$char作為分隔符來連接一個空列表(無元素)。

這是解決所有這些問題的嘗試:

use strict;
use warnings;

my $sentence = readline;

$sentence =~ s{([A-Za-z]+)}{
    my $word = $1;
    join '', map {
        my $base = ord(/^[A-Z]/ ? 'A' : 'a');
        chr((ord($_) - $base + length($word)) % 26 + $base)
    } split //, $word
}eg;

print $sentence;

認為您正在執行的是ro​​t3編碼,但是如果是這樣,那么您的示例是錯誤的

my $sentence = 'Hi! how are you doing?';
$sentence =~ tr/A-Za-z/D-ZA-Cd-za-c/;
print $sentence, "\n";

輸出

Kl! krz duh brx grlqj?

相似但不相同

Jk! krz duh brx itnsl?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM