凯撒密码 - “此外不是数字(+)”

时间:2016-11-24 17:21:18

标签: perl arguments

我正在使用Perl创建一个Caesar密码,但我似乎无法在代码中找到错误。

我不断收到错误消息:

  

参数“hello”在./Lab03.pl第66行附加(+)不是数字,<>第1行。

这是$translated += $symbol行。

use warnings;
$x = 26;

sub getMode {

    $e = "encrypt decrypt";

    while ( 'True' ) {

        print "Do you wish to encrypt or decrypt a message? \n";
        $mode = <STDIN>;
        chomp( $mode );

        if ( $mode = split( //, $e ) ) {
            return $mode;
        }
        else {
            print "Enter either 'encrypt' or 'decrypt'.\n";
        }
    }
}

sub getMessage {

    print "Enter your message:";
    $input = <STDIN>;
    chomp( $input );

    return $input;
}

sub getKey {

    $key = 0;

    while ( 'True' ) {

        print "Enter the key number (1-26): ";
        $key = int( <> );
        chomp( $key );

        if ( $key >= 1 and $key <= $x ) {
            return $key;
        }
    }
}

sub getTranslatedMessage {
    ( $mode, $message, $key ) = @_;

    if ( $mode =~ /^d/ ) {
        $key        = -$key;
        $translated = '';
    }

    foreach $symbol ( $message ) {

        if ( $symbol =~ /[A-Za-z]/ ) {
            $num = ord( $symbol );
            $num += $key;
        }

        if ( $symbol =~ /^[A-Z]/ ) {

            if ( $num > ord( 'Z' ) ) {
                $num -= 26;
            }
            elsif ( $num < ord( 'A' ) ) {
                $num += 26;
            }
            elsif ( $symbol = /^[a-z]/ ) {

                if ( $num > ord( 'z' ) ) {
                    $num -= 26;
                }
                elsif ( $num < ord( 'a' ) ) {
                    $num += 26;
                }

                $translated += chr( $num );
            }
        }
        else {
            $translated += $symbol;
        }
    }

    return $translated;
}

$mode    = getMode();
$message = getMessage();
$key     = getKey();

print "Your translated text is: '\n' ";
print( getTranslatedMessage( $mode, $message, $key ) );

1 个答案:

答案 0 :(得分:2)

在Perl中,+仅是数字加法。字符串连接是. / .=

此外:

if ($mode = split(//,$e)){

不正确。我相信你想要的东西:

my %valid_mode = ( 'encrypt' => 1, 'decrypt' => 1);
...
    if ( $valid_mode{$mode} ) {
        return $mode

您拥有的代码是将$ mode设置为$ e中的字符数(以低效的方式)。

下面:

foreach $symbol ($message){

在Perl中,字符串是第一类实体;它们不会自动解释为字符数组。因此,要遍历字符,您需要其他内容。最简单的方法是:

foreach $symbol ( split //, $message ) {

下面:

    elsif ($symbol= /^[a-z]/){

=应为=~

还存在一个问题,即哪些代码阻止将大写字符添加到输出中。在我看来,你的冷杉if ($symbol =~的闭合支撑应该在其他之前,而其他支撑可能固定匹配。

将所有}放在他们自己的一行上,与对应{的行缩进相同,这是一个更好的主意。它将帮助您更轻松地看到不匹配的括号。

以下是更正的代码,添加了use strict并声明了所有变量:

use warnings;
use strict;

my $x = 26;
sub getMode{
    my %valid_mode = ( 'encrypt' => 1, 'decrypt' => 1 );
    while ('True'){
        print"Do you wish to encrypt or decrypt a message? \n";
        my $mode = <STDIN>;
        chomp ( $mode);
        if ($valid_mode{$mode}) {
            return $mode;
        }
        else {
           print "Enter either 'encrypt' or 'decrypt'.\n";
        }
    }
}
sub getMessage{
    print"Enter your message:";
    my $input = <STDIN>;
    chomp ($input);
    return $input;
}

sub getKey{
    my $key = 0;
    while ('True'){
        print"Enter the key number (1-26): ";
        $key = int(<>);
        chomp ($key);
        if ($key >= 1 and $key <= $x){
            return $key;
        }
    }
}
sub getTranslatedMessage{
    my ($mode, $message, $key) = @_;
    if ($mode =~ /^d/){
        $key = -$key;
    }
    my $translated = '';

    foreach my $symbol (split //, $message){
        if ($symbol =~ /[A-Za-z]/){
            my $num = ord($symbol);
            $num += $key;

            if ($symbol =~ /^[A-Z]/){
                if ($num > ord('Z')){
                   $num -= 26;
                }
                elsif ($num < ord('A')){
                    $num += 26;
                }
            }
            elsif ($symbol=~ /^[a-z]/){
                if ($num > ord('z')){
                    $num -= 26;
                }
                elsif ($num < ord('a')){
                    $num += 26;
                }
            }

            $translated .= chr($num);
        }
        else{
            $translated .= $symbol;
        }
    }

    return $translated;
}

my $mode = getMode();
my $message = getMessage();
my $key = getKey();

print"Your translated text is:\n";
print(getTranslatedMessage($mode, $message, $key));
print "\n";

总而言之,我建议您编写较小的代码块并对其进行测试,以确保它们在将它们组合在一起之前有效。