2012年4月10日火曜日

開発環境

『初めての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 コメント:

risouさんのコメント...

~~ の右辺と左辺が逆。

kamimuraさんのコメント...

情報ありがとうございますm(_ _)m
risouさんの通りに修正したら上手くいきました!

コメントを投稿