#!/usr/bin/perl use strict; use warnings; sub sum1 { for my $tot (shift) { my $n_undef = 0; for (@_) { ++$n_undef if !defined $_ } if (!defined $tot && $n_undef == 0) { $tot = 0; for (@_) { $tot += $_ } return 1; } elsif (defined $tot && $n_undef == 1) { my $x = $tot; my $ref; for (@_) { if (defined $_) { $x -= $_ } else { $ref = \$_ } } $$ref = $x; return 1; } elsif (defined $tot && $n_undef == 0) { my $tot2 = 0; for (@_) { $tot2 += $_ } return $tot == $tot2; } else { return 0; } } } sub add { my $tot = 0; for (@_) { $tot += $_ } return $tot; } sub subt { my $diff = shift; for (@_) { $diff -= $_ } return $diff; } sub sum { my $ref = find_result(@_); if (!defined $_[0]) { $$ref = add(find_args(@_)); } else { $$ref = subt(find_args(@_)); } } sub find_result { return \grep {!defined $_} @_; } sub find_args { return grep {defined $_} @_; } sub prod { } my ($a, $b, $c, $d) = (1, undef, 2, 3); sum($a, $b, $c, $d); print "$a $b $c $d\n"; # my $ref = find_result($a, $b, $c, $d); # $$ref = 6; # # my @args = find_args($a, $b, $c, $d); # $args[0] = 7; # # print "@args\n"; # print "$a $b $c $d\n"; # print "$b\n"; #my (@foo) = (1, 2, 3, 4);