#!usr/bin/perl use strict; use warnings; sub req_args { my $nArgs = @ARGV; die "$_[0] argument(s) required but $nArgs given!\n" if $_[0] != $nArgs; } my $pi=3.141592654; my %dispatch = ( tri => { area => sub { req_args(2); return 0.5*$ARGV[0]*$ARGV[1]; }, peri => sub { req_args(3); return $ARGV[0]+$ARGV[1]+$ARGV[2]; }, hypo => sub { req_args(2); return sqrt($ARGV[0]*$ARGV[0]+$ARGV[1]*$ARGV[1]); }, }, cir => { area => sub { req_args(1); return $ARGV[0]*$ARGV[0]*$pi; }, #radius peri => sub { req_args(1); return $pi*$ARGV[0]; }, #diameter hypo => sub { die "Option 'hypo' only allowed for triangle." }, }, rec => { area => sub { req_args(2); return $ARGV[0]*$ARGV[1]; }, peri => sub { req_args(2); return 2*($ARGV[0]+$ARGV[1]); }, hypo => sub { die "Option 'hypo' only allowed for triangle." }, }, sqr => { area => sub { req_args(1); return $ARGV[0]*$ARGV[0]; }, peri => sub { req_args(1); return 4*$ARGV[0]; }, hypo => sub { die "Option 'hypo' only allowed for triangle." }, }, ); die "You need to specify at least 3 args." if @ARGV < 3; # $what to calculate on $which type of figure my ($which, $what) = (shift, shift); die "Unknown type '$which' of figure." unless exists $dispatch{$which}; die "Unknown type '$what' of calculation." unless exists $dispatch{$which}{$what}; print "The answer is ", $dispatch{$which}{$what}(), ".\n";