[英]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;
我認為您正在執行的是rot3編碼,但是如果是這樣,那么您的示例是錯誤的
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.