第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;



}

你可能感兴趣的:(匹配)