Snippets

sironekotoro Perl入学式 2018 第4回 復習問題 calc.pl

Created by sironekotoro
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;

# Perl入学式 2018 第4回 復習問題
# https://github.com/perl-entrance-org/workshop-2018/blob/master/4th/practice.md
# 復習問題(calc.pl)

# 2つの数値を引数に取り, 以下の機能を持つ関数 calc を作成してください.
#  1.add, sub, mul, div, mod という key と、
#    それぞれの演算結果(+, -, *, /, %)を value
#    に持つハッシュリファレンスを返す.
#  2.引数が数字であるかどうか正規表現を使って判定する.
#  3.数値以外が引数であった場合は undef を返す.

my $hash_ref = calc( 32, 5 );
print Dumper $hash_ref;

$hash_ref = calc( 3, 0 );
print Dumper $hash_ref;

$hash_ref = calc( 32, 'A' );
print Dumper $hash_ref;


sub calc {
    my ( $left, $right ) = @_;

 # 2.引数が数字であるかどうか正規表現を使って判定する.
 # 数値かどうかの判別には正規表現のメタ文字 \D を利用
    if ( $left =~ /\D+/ || $right =~ /\D+/ ) {

        # 3.数値以外が引数であった場合は undef を返す.
        return undef;
    }
    elsif ( $right == 0 ) {

     # 0で除算の際にはエラーになるので、第二引数 $rightが
     # 0 の場合には、div,modを除いた結果を返す
     # (条件文にはないけど追加)

        return {
            add => $left + $right,
            sub => $left - $right,
            mul => $left * $right,
        };

    }
    else {
        #  1.add, sub, mul, div, mod という key と、
        #    それぞれの演算結果(+, -, *, /, %)を value
        #    に持つハッシュリファレンスを返す.

        return {
            add => $left + $right,
            sub => $left - $right,
            mul => $left * $right,
            div => $left / $right,
            mod => $left % $right,
        };
    }

}

Comments (0)