読者です 読者をやめる 読者になる 読者になる

Perl入学式復習問題2013-4-2

perl Perl入学式

Perl入学式最新復習問題の2問目。
設問は以下。

calc.plで作成した関数における引数が数字であるかどうか正規表現を使って判定するように改良してください.
数値以外が引数であった場合は undef を返すようにしてください.

回答はこんな。

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

sub calc {
    my ($num1, $num2) = @_;
    if ($num1 =~ /\D/ || $num2 =~ /\D/) {
        return "undef\n";
    } else {
        my $add = $num1 + $num2;
        my $sub = $num1 - $num2;
        my $mul = $num1 * $num2;
        my $div = $num1 / $num2;
        my $mod = $num1 % $num2;
        my $results = {
            add => "$add",
            sub => "$sub",
            mul => "$mul",
            div => "$div",
            mod => "$mod",
        };
        return $results; 
    }
}

my $var = calc(14, 3); #両方数字。演算されるはず
my $hoge = calc('str', 3); #前者が文字列。undefになるはず
my $foo = calc(14, 'str'); #後者が文字列。undefになるはず
my $piyo = calc('str1', 'str2'); #両方文字列。undefになるはず

print Dumper $var;
print Dumper $hoge;
print Dumper $foo;
print Dumper $piyo;

出力結果

$VAR1 = {
          'div' => '4.66666666666667',
          'sub' => '11',
          'add' => '17',
          'mul' => '42',
          'mod' => '2'
        };
$VAR1 = 'undef
';
$VAR1 = 'undef
';
$VAR1 = 'undef
';

途中で、あれ、もしかしたら質問の意図ってターミナルで実行するときに引数を入れさせる感じなのかな、と思って@ARGV入れる風にやってみたりしたが、うまくいかなかったので上のようにした。

第1問とあわせてGitHubに上げています。
https://github.com/note103/perl_entrance/tree/master/2013_4