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