如何编辑Perl字符串以保留其原始格式?

时间:2014-04-11 03:16:23

标签: string perl encryption split

我正在尝试编写一个代码,该代码将使用基本循环移位密码对字母进行加密,同时保留任何不是字母的字符。我试图通过使用找到每个字母的新值的子来做到这一点。当我现在运行代码时,它会格式化结果,因此每个加密字母之间只有一个空格,而不是保留原始格式。我也无法将结果只用小写字母。

sub encrypter {
        my $letter = shift @_;
        if ($letter =~ m/^[a-zA-Z]/) {
                $letter =~ y/N-ZA-Mn-za-m/A-Za-z/;
                return $letter;
                }
        else {

                return lc($letter);
        }
}
print "Input string to be encrypted: ";
my $input = <STDIN>;
chomp $input;
print "$input   # USER INPUT\n";
my @inputArray = split (//, $input);
my $i = 0;
my @encryptedArray;
for ($i = 0; $i <= $#inputArray; $i++) {
        $encryptedArray[$i] = encrypter($inputArray[$i]);
}
print "@encryptedArray   # OUTPUT\n";

3 个答案:

答案 0 :(得分:4)

问题在于如何打印阵列。

更改此行:

print "@encryptedArray   # OUTPUT\n";

为:

print join("", @encryptedArray) . "   # OUTPUT\n";

这是一个说明问题的例子。

#!/usr/bin/perl

my @array = ("a","b","c","d");

print "@array  # OUTPUT\n";
print join("", @array) . "  # OUTPUT\n";

输出:

$ perl test.pl
a b c d  # OUTPUT
abcd  # OUTPUT

根据print上的Perl文档:

  

在每个LIST项目之间打印$,(如果有)的当前值。   在整个LIST之后打印$ \(如果有)的当前值   印刷了。

另外两种方法是:

#!/usr/bin/perl

my @array = ("a","b","c","d");
$,="";
print @array, "  #OUTPUT\n";

#!/usr/bin/perl

my @array = ("a","b","c","d");
$"="";
print @array, "  #OUTPUT\n";

Here是相关答案,here是解释$"$,的文档。

答案 1 :(得分:2)

$"(列表分隔符)输出中的那些空格,因为您使用print "@encryptedArray"打印该数组,等于print join($", @encryptedArray),因此可以通过

禁用它们
local $" = '';

或者您可以在打印之前自己加入@encryptedArray,就像@Matt建议的那样。

答案 2 :(得分:0)

请注意,不需要这种复杂性。 tr/// - 也称为y/// - 将为您转换整个字符串。喜欢这个

use strict;
use warnings;

print "Input string to be encrypted: ";
chomp(my $input = <STDIN>);
print "$input   # USER INPUT\n";

(my $encrypted = $input) =~ tr/N-ZA-Mn-za-m/A-Za-z/;
print "$encrypted   # OUTPUT\n";