1 . 猜数字游戏,使用given结构实现。 想想看该如何处理非数字的输入? 这里不需要用智能匹配。
use 5.016; my $Verbose = $ENV{VERBOSE} // 1 ; #根据环境变量决定是否打印 my $hit = int(rand(100)+1) ; #1-100 以内随机数的产生 print "hit number:$hit " if $Verbose ; #根绝环境变量打印答案数字 while (1) { print "Please enter a guess from 1 to 100:"; chomp(my $guess = <STDIN> ); #输入数字 # given when 结构 given($guess) { when( ! /Ad+/ ) {say "Not a number!"} #A行首 行尾 非数字 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 " File does not exist!"} #文件不存在直接测试下一个文件 when ( -r _ ) { say " Readable!" ; continue} #虚拟句柄测试 可读 when ( -w _ ) { say " Writable!" ; continue} #虚拟句柄测试 可写 when ( -x _ ) { say " Excutable!" } #虚拟句柄测试 可执行 }
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 ( ! /Ad+/ ) {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 ( ! /Ad+/ ) {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; }