#!/usr/bin/perl -w # # Demonstrate the importance of "use warnings" and "use strict"! # 051004 liverpole # ############## ### Strict ### ############## use strict; use warnings; ################## ### Prototypes ### ################## sub ratio_change($$$$); sub random_change($); #################### ### Main program ### #################### my $start_value = my $new_value = 100; my $start_total = my $new_total = 1000; my $ratio0 = 100 * $start_value / $start_total; my $ratio1 = $ratio0; for (my $i = 0; $i < 100000; $i++) { if (ratio_change($start_value, $start_total, $new_value, $new_total)) { $ratio1 = $ratio1 = 100 * $new_value / $new_total; } $start_value = $new_value; $start_total = $new_total; $new_value = random_change($start_value); $new_total = random_change($start_total); } printf "Start percentage ... %7.4f%%\n", $ratio0; printf " End percentage ... %7.4f%%\n", $ratio1; ################### ### Subroutines ### ################### sub random_change($) { my ($value) = @_; (rand(100) > 0.005) and return $value; # No change 99.995% of the time return $value + int(rand(3)) - 1; # Make a change of -1, 0, or +1 } sub ratio_change($$$$) { my ($value0, $total0, $value1, $total1) = @_; my $ratio0 = $value0 / $total0; my $ratio1 = $value1 / $total1; ($ratio0 == $ratio1) and return 0; # No change in ratio my $text = "Ratio Change: $ratio0 => $ratio1\n"; print STDERR $text; return 1; } #### Ratio Change: 0.1 => 0.101 Ratio Change: 0.101 => 0.100899100899101 Ratio Change: 0.100899100899101 => 0.101898101898102 Ratio Change: 0.101898101898102 => 0.100899100899101 Ratio Change: 0.100899100899101 => 0.0999000999000999 Ratio Change: 0.0999000999000999 => 0.0989010989010989 Ratio Change: 0.0989010989010989 => 0.0988023952095808 Start percentage ... 10.0000% End percentage ... 9.8802% #### my $text = "Ratio Change: $ratio0 => $ratio1\n"; #### my $text = "Ratio Change: %7.4f => %7.4f\n", $ratio0, $ratio1; #### my $text = sprintf "Ratio Change: %7.4f => %7.4f\n", $ratio0, $ratio1; #### Useless use of private variable in void context at warn.pl line 59. Useless use of private variable in void context at warn.pl line 59. #### Ratio Change: %7.4f => %7.4f Ratio Change: %7.4f => %7.4f Ratio Change: %7.4f => %7.4f Start percentage ... 10.0000% End percentage ... 9.9900% #### Ratio Change: 0.1000 => 0.1010 Ratio Change: 0.1010 => 0.1011 Ratio Change: 0.1011 => 0.1012 Ratio Change: 0.1012 => 0.1013 Ratio Change: 0.1013 => 0.1012 Start percentage ... 10.0000% End percentage ... 10.1202% #### Global symbol "$ratio0" requires explicit package name at ./warn.pl line 26. Global symbol "$ratio1" requires explicit package name at ./warn.pl line 27. Global symbol "$ratio0" requires explicit package name at ./warn.pl line 27. Global symbol "$ratio1" requires explicit package name at ./warn.pl line 30. Global symbol "$ratio1" requires explicit package name at ./warn.pl line 30. Global symbol "$ratio0" requires explicit package name at ./warn.pl line 37. Global symbol "$ratio1" requires explicit package name at ./warn.pl line 38. Global symbol "$ratio0" requires explicit package name at ./warn.pl line 54. Global symbol "$ratio1" requires explicit package name at ./warn.pl line 55. Global symbol "$ratio0" requires explicit package name at ./warn.pl line 57. Global symbol "$ratio1" requires explicit package name at ./warn.pl line 57. Global symbol "$ratio0" requires explicit package name at ./warn.pl line 59. Global symbol "$ratio1" requires explicit package name at ./warn.pl line 59. Execution of ./warn.pl aborted due to compilation errors. #### Ratio Change: 0.1000 => 0.1001 Ratio Change: 0.1001 => 0.1000 Ratio Change: 0.1000 => 0.0990 Ratio Change: 0.0990 => 0.1000 Ratio Change: 0.1000 => 0.0990 Ratio Change: 0.0990 => 0.0991 Ratio Change: 0.0991 => 0.0992 Start percentage ... 0.0992% End percentage ... 0.0992%