Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1572533
  • 博文数量: 289
  • 博客积分: 11086
  • 博客等级: 上将
  • 技术积分: 3291
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-22 17:06
个人简介

徐小玉的博客。

文章分类

全部博文(289)

文章存档

2023年(6)

2022年(1)

2021年(2)

2020年(9)

2019年(9)

2018年(6)

2017年(10)

2016年(10)

2014年(3)

2013年(4)

2011年(12)

2010年(16)

2009年(14)

2008年(119)

2007年(48)

2006年(20)

我的朋友

分类:

2008-03-21 15:52:52

#!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;
 
  
阅读(1242) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~