【问题标题】:How can I get Perl string to keep its original formatting after editing it?编辑后如何让 Perl 字符串保持其原始格式?
【发布时间】:2014-05-25 00:48:53
【问题描述】:

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

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";

【问题讨论】:

    标签: string perl encryption split


    【解决方案1】:

    问题在于如何打印数组。

    改变这一行:

    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 是解释$"$, 的文档。

    【讨论】:

    • $, 的默认值为undef,因此打印项之间不会打印任何内容,并且该值不需要更改。
    【解决方案2】:

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

    禁用它们
    local $" = '';
    

    或者您可以在打印之前自行加入@encryptedArray,正如@Matt 所建议的那样。

    【讨论】:

      【解决方案3】:

      请注意,没有必要这么复杂。 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";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-24
        • 1970-01-01
        • 2022-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多