数组 – Perl中的莫尔斯代码解码器

我正在努力教自己Perl和我一直在努力…昨晚我做了一个程序来计算用户提供的一组数字的平均值,以便了解列表和用户输入所以今天我想我会做莫尔斯码解码器,了解哈希.我仔细阅读了我买的这本书并没有真正解释哈希……它实际上并没有很好地解释很多事情.任何帮助,将不胜感激!

无论如何,我想编写一个解码用户输入的莫尔斯代码的程序.所以用户会输入:

-.-.
.-
-
...
!
.-.
..-
.-..
.

感叹号将代表一个单独的词.此消息将向用户返回“Cats Rule”.下面是我到目前为止的代码……记住..我已经在perl编程了不到24小时哈哈.

码:

use 5.010;




my %morsecode=(
    '.-'    =>'A','-...'  =>'B','-.-.'  =>'C','-..'   =>'D','.' =>'E','..-.'  =>'F','--.'   =>'G','....'  =>'H','..'    =>'I','.---'  =>'J','-.-'   =>'K','.-..'  =>'L','--'    =>'M','-.'    =>'N','---'   =>'O','.--.'  =>'P','--.-'  =>'Q','.-.'   =>'R','...'   =>'S','-' =>'T','..-'   =>'U','...-'  =>'V','.--'   =>'W','-..-'  =>'X','-.--'  =>'Y','--..'  =>'Z','.----' =>'1','..---' =>'2','...--' =>'3','....-' =>'4','.....' =>'5','-....' =>'6','--...' =>'7','---..' =>'8','----.' =>'9','-----' =>'0','.-.-.-'=>'.','--..--'=>',','---...'=>':','..--..'=>'?','.----.'=>'\'','-...-' =>'-','-..-.' =>'/','.-..-.'=>'\"'
);

my @k = keys %morsecode;
my @v = values %morsecode;

say "Enter a message in morse code separated by a line. Use the exclamation point (!) to separate words. Hit Control+D to signal the end of input.";
my @message = <STDIN>;
chomp @message;

my $decodedMessage = encode(@message);


sub encode {
    foreach @_ {
    if (@_ == @k) {
        return @k;

#This is where I am confused... I am going to have to add the values to an array,but I don't really kNow how to go about it.


        }
    else if(@_ == '!') {return ' '}
    else
    {
    return 'Input is not valid';
    }
    }
}

解决方法

您的代码包含两个语法错误:foreach需要一个列表来迭代;这意味着parens.与C和其他语言不同,Perl不支持else(…).相反,使用elsif(…).

然后有一些语义错误:迭代的当前值存储在$_中.数组@_包含对函数调用的参数.

Perl以不同的方式比较字符串和数字:

Strings Numbers
eq      ==
lt      <
gt      >
le      <=
ge      >=
ne      !=
cmp     <=>

对于手头的任务,使用正确的运算符,在这种情况下,是严格的运算符.

(你的代码@_ == @k做了一些事情,即在数字上下文中使用数组.这会产生元素的数量,随后进行比较.@_ ==’!’只是很奇怪.)

你真正想要做的是将输入的值映射到一个字符列表.您的哈希定义了此映射,但我们想要应用它. Perl有一个map函数,它的工作原理就像

@out_list = map { ACTION } @in_list;

在操作块内,当前值可用作$_.

我们希望我们的操作在哈希中查找适当的值,或者如果输入字符串没有映射,则包含错误消息:

my @letters = map { $morsecode{$_} // "<unkNown code $_>" } @message;

这假定!被注册为morsecode哈希中的空格.

然后我们通过将它们与空字符串连接来制作这些字母的单个字符串:

my $translated_message = join "",@letters;

别忘了打印出结果!

完整的代码

#!/usr/bin/perl
use strict; use warnings; use 5.012;

my %morsecode=(
  '.-'    =>'A','.'     =>'E','-'     =>'T','.-..-.'=>'"','!'     =>' ',);

say "Please type in your morse message:";
my @codes = <>;
chomp @codes;

my $message = join "",map { $morsecode{$_} // "<unkNown code $_>" } @codes;

say "You said:";
say $message;

这产生了所需的输出.

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...