開発環境
- OS X Lion - Apple(OS)
- TextWrangler(Text Editor) (BBEditの機能制限無料版、light版)
- Script言語:Perl
『初めてのPerl 第5版』(Randal L. Schwartz, Tom Phoenix, brian d foy 共著、近藤 嘉雪 訳、オライリー・ジャパン、2009年、ISBN978-4-87311-427-9) の15章(スマートマッチとgiven-when), 15.6(練習問題)5を解いてみる。
5.
やり方の1つ。(「やり方は何通りもある」(TIMTOWTDI(There Is More Than One Way To Do It.)))
コード(TextWrangler)
#!/usr/bin/env perl use strict; use warnings; use 5.010; sub divisors{ my $number = shift; my @divisors = (); for(2..$number/2){ push @divisors, $_ unless $number % $_; } return @divisors; } given($ARGV[0]){ when(/\D+/){say "NaN";} say "好きな数を入力"; chomp(my $num = <STDIN>); my @divisors = divisors $_; when(@divisors ~~ 2){say "偶数";continue;} when(!(@divisors ~~ 2)){say "奇数";continue;} when(@divisors ~~ $num){say "好きな数の倍数"; continue;} when(@divisors ~~ []){say "素数";} default{say "約数一覧: @divisors";} }
入出力結果(Terminal)
$ perl sample.pl 99 好きな数を入力 10 奇数 約数一覧: 3 9 11 33 $ perl sample.pl 100 好きな数を入力 10 奇数 約数一覧: 2 4 5 10 20 25 50 $
約数一覧以外が上手くいかない。どこが間違ってるのかな。。
追記: 2012/05/17
コメント欄でrisouさんに教えて頂けたのでコードを修正。
コード(TextWrangler)
#!/usr/bin/env perl use strict; use warnings; use 5.012; sub divisors{ my $number = shift; my @divisors = (); for(2..$number/2){ push @divisors, $_ unless $number % $_; } return @divisors; } given($ARGV[0]){ when(/\D+/){say "NaN";} say "好きな数を入力"; chomp(my $num =); my @divisors = divisors $_; when(2 ~~ @divisors){say "偶数";continue;} when(!(2 ~~ @divisors)){say "奇数";continue;} when($num ~~ @divisors){ say "好きな数の倍数"; continue;} when([] ~~ @divisors){say "素数";} default{say "約数一覧: @divisors";} }
入出力結果(Terminal)
$ perl sample.pl 99 好きな数を入力 10 奇数 約数一覧: 3 9 11 33 $ perl sample.pl 100 好きな数を入力 10 偶数 好きな数の倍数 約数一覧: 2 4 5 10 20 25 50 $ perl sample.pl 11 好きな数を入力 10 奇数 素数 $ perl sample.pl perl NaN $
本書にはスマートマッチ演算子は可換て書いてあったけど仕様が変わったのかな〜
2 コメント:
~~ の右辺と左辺が逆。
情報ありがとうございますm(_ _)m
risouさんの通りに修正したら上手くいきました!
コメントを投稿