#!C:\Perl\bin\perl -w
# 思路不是我的,是专家的,但是专家后边的部分太专业我看不懂得,就自己改成自己的方式了。
use strict;
use warnings;
print "Please inout the number:\n";
chomp(my $number=<>);
die "invalid numbers:'$number'\n" unless $number =~ /^\d{7}$/;
# 如果输入的不是7个数字,就判断输入错误
my @groups=qw(ABC DEF GHI JKL MNO PRS TUV WXY);
my $group;
my ($letter,$digits);
foreach my $digit (2..9)
{
my $group = $groups[$digit-2];
$letter .=$group;
$digits .=$digit x length($group);
} # 这里的目的是形成一种2-9数字连续,a-z字母连续的状态, 循环结束后,digits该是222333...999 而letters该是AAABBB...ZZZ 这样做的目的是使它们二者对应,之后可以使用tr///进行数字与字母之间的替换操作。
open (my $fh, "<","wordlist.txt") or die;
my $hh;
foreach (<$fh>)
{
local $_=$_;
$hh = $_;
eval "tr/$letter\L$letter\E/$digits$digits/";
# 因为我们需要对大小写不敏感,故\L$letter\E匹配了小写字母。
chomp($_);
if( $_ eq $number)
{
print "$_\n";
print "the word should be :$hh\n";
exit;
}
}
# 专家的做法主要是在最后一个foreach部分与我不同,他的做法是:
while (<$fh>) {
local $_ = $_;
eval "tr/$letters\L$letters\E/$digits$digits/";
last if /^$number$/o;
}
print uc if defined;
阅读(1236) | 评论(0) | 转发(0) |