第15章习题(智能匹配)

1 . 猜数字游戏,使用given结构实现。 想想看该如何处理非数字的输入? 这里不需要用智能匹配。

use 5.016;

my $Verbose =   $ENV{VERBOSE} // 1 ; #根据环境变量决定是否打印
my $hit = int(rand(100)+1) ; #1-100 以内随机数的产生

print "hit number:$hit\n" if  $Verbose ; #根绝环境变量打印答案数字

while (1) {
    print "Please enter a guess from 1 to 100:";
    chomp(my $guess = <STDIN> );  #输入数字
    # given when 结构
    given($guess) {
        when( ! /\A\d+\Z/ ) {say "Not a number!"}  #\A行首 \Z行尾 非数字
        when( $_ > $hit )  {say "Too High!" }
        when( $_ < $hit )  {say "Too low!"  }
        default   {say "Just right!"; last }     #猜中跳出循环

    }
}

 

2. 用given-when 结构写一个程序,根据输入的数字,如果能被3整除,就打印“Fizz”,如果能被5整除,就打印“Bin”,如果能被7整除就打印“sausage”。

    比如输入数字是15,程序就该打印“Fizz”和 “Bin”,因为15可以同时被3和5整除。 思考一下,可以让程序输出”Fizz Bin Sausage”的最小数字是多少?

use 5.016;

foreach  ( 1 .. 200 ) {
    my $what= '' ;  #赋值空串
    my $count;      #记录次数
    given($_) {
        when ( not  $_ % 3 ) { $what .= ' Fizz'; $count++;continue}
        when ( not  $_ % 5 ) { $what .= ' Bin'; $count++; continue}
        when ( not  $_ % 7 ) { $what .= ' Sausage';$count++; }
    }

    say "$_$what";
    last if $count == 3;  # 最小的能被3,5,7整除的数字 105
}

 

3. 用for-when 写个程序,要求从命令行遍历某个目录下的文件列表,并报告每个文件的可读,可写和可执行属性状态。不需要使用智能匹配。

use 5.016;

# 遍历命令行的文件
for (@ARGV) {
    say "Processing $_";
    when ( ! -e ) { say "\tFile does not exist!"}        #文件不存在直接测试下一个文件
    when ( -r _ ) { say "\tReadable!" ; continue}        #虚拟句柄测试 可读
    when ( -w _ ) { say "\tWritable!" ; continue}        #虚拟句柄测试 可写
    when ( -x _ ) { say "\tExcutable!" }                 #虚拟句柄测试 可执行
}

 

4. 使用given和智能匹配写个程序,从命令行得到一个数字,打印出这个数字除了1和它本身以为的因数。例如输入99,你写的程序报告3,9,11和33这4个数。

如果输入的数字就是一个质数,程序要报告说明这是质数。如果输入的不是数字,也应该报告错误,不会继续计算。

#!/usr/bin/perl
# 第15 章第四题
# 智能匹配

use 5.016;

say "Checking the number:<$ARGV[0]>";  #命令行输入数字进行检查


#given-when 智能匹配
given($ARGV[0]) {
    when ( ! /\A\d+\Z/ ) {say "Not a number!" };  #非数字
    
    my @divisors = divisors($_); #调用质数函数

    when ( @divisors ~~ [] ) { say "Number is a prime!" };  #与匿名空数组 智能匹配

    default {say "$_ is divisiable by @divisors"};          # 输出非质数的因子。


}



#返回质数的函数
sub divisors {
    my $number = shift ;

    my @divisors = ();  #空数组
    foreach my $divisor  ( 2 .. ($number/2)) {
        push @divisors,$divisor unless $number % $divisor ;
    }

    return @divisors;

}

 

5.修改上题程序,报告输入数字的奇偶情况,是否是质数,是否可以被某个你喜欢的数字整除,还是只能用智能匹配实现。

#!/usr/bin/perl
# 第15 章第五题
# 智能匹配

use 5.010;

say "Checking the number:<$ARGV[0]>";  #命令行输入数字进行检查

my $love_number = 5; #喜爱的数字

#given-when 智能匹配
given($ARGV[0]) {
    when ( ! /\A\d+\Z/ ) {say "Not a number!" }  #非数字
    
    my @divisors = divisors($_); #调用质数函数

    when ( 2 ~~ @divisors ) {say "$_ is odd!"; continue}                                     #奇数
    when ( !(2 ~~ @divisors)) {say "$_ is even!"; continue}                                  #偶数
    when ($love_number ~~ @divisors ) {say "$_ is divisalbe by love number!"; continue}                                     #被幸运数字
    when ($love_number) { say "$_ is my favoraite number! " ; continue}                        #是幸运数字
    
    when (@divisors ~~ [] ) { say "$_ is a prime!" }  #与匿名空数组 智能匹配               # 质数

    default {say "$_ is divisable by @divisors"}                                            #因数输出
    

    


}



#返回质数的函数
sub divisors {
    my $number = shift ;

    my @divisors = ();  #空数组
    foreach my $divisor  ( 2 .. ($number/2)) {
        push @divisors,$divisor unless $number % $divisor ;
    }

    return @divisors;

}
posted @ 2013-10-09 09:35  新闻官  阅读(217)  评论(0编辑  收藏  举报