#!/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%