in reply to Trying to avoid 9 conditionals

Use a hash to store the original version values and another to store the edits then you can:

use strict; use warnings; my @valueNames = qw/major minor revision/; my %oldVersions = ( aht => {major => 8, minor => 3, revision => 6}, dog => {major => 3, minor => 3, revision => 1}, ); my %versionEdits = ( aht => {major => 9, minor => 4, revision => 0}, dog => {revision => 2}, ); for my $version (sort keys %versionEdits) { my %values; $values{$_} = $oldVersions{$version}{$_} for @valueNames; for my $edit (sort keys %{$versionEdits{$version}}) { my $newValue = $versionEdits{$version}{$edit}; print "Update $version set $edit = $newValue #DBVersion "; print join '.', @values{@valueNames}; print "\n"; $values{$edit} = $newValue; } }

Prints:

Update aht set major = 9 #DBVersion 8.3.6 Update aht set minor = 4 #DBVersion 9.3.6 Update aht set revision = 0 #DBVersion 9.4.6 Update dog set revision = 2 #DBVersion 3.3.1

which scales nicely as you add more things you are tracking versions of. The general rule is - if there is more than one, put it in a data structure. If you find you are using a proliferation of variables you have probably gone about it in the wrong way. If you find yourself writing the same piece of code over again you have probably gone about it the wrong way.


Perl reduces RSI - it saves typing

Replies are listed 'Best First'.
Re^2: Trying to avoid 9 conditionals
by techsan02 (Initiate) on Oct 17, 2008 at 19:23 UTC
    Thanks for the response. I implemented and it works great! Is there anyway to only print out the ones that changed? For example if the old version was 836 and the new version was 840 then only print out
    Update aht set minor = 4 #DBVersion 8.3.6 Update aht set revision = 0 #DBVersion 8.4.6
    Or if the old was 836 and the new was 837 only print out
    Update aht set revision = 7 #DBVersion 8.3.6

      The intent of %versionEdits was that it would only contain the edits that you want to be reported. I don't know how you are obtaining the version change information that you were using to populate $UpdatedMinor etc so I can't advise on how best to populate %versionEdits. If you have an original version number and a current version number you could do something like:

      my @valueNames = qw/major minor revision/; my @versions = ( [qw(aht 8.3.6 9.4.0)], [qw(dog 3.3.1 3.3.2)], ); for my $version (@versions) { my ($app, $oldStr, $newStr) = @$version; my %old; my %new; @old{@valueNames} = split /\./, $oldStr; @new{@valueNames} = split /\./, $newStr; for my $name (@valueNames) { $oldVersions{$app}{$name} = $old{$name}; next if $new{$name} == $old{$name}; $versionEdits{$app}{$name} = $new{$name}; } }

      Perl reduces RSI - it saves typing