#!/usr/bin/env perl use strict; use warnings; use feature 'say'; sub multiply { my ( $x, $y, $implementation ) = @_; $implementation->( $x, $y ); } sub whateverthedefaultis { my ( $x, $y ) = @_; return $x * $y; } # https://blogs.msdn.microsoft.com/matthew_van_eerde/2009/07/23/bad-perl-russian-peasant-multiplication-algorithm/ sub peasant { my ( $a, $b ) = @_; my $c; map { $c += $_ * $b } grep { $a & $_ } map { 1 << $_ } ( 0 .. log($a) / log 2 ); return $c; } say multiply( 7, 3, \&whateverthedefaultis ); say multiply( 7, 3, \&peasant );