I’m comparing Objective-C decision making with our beloved Perl decision making. Objective-C supports the if, else, else if & switch
. Lets write some Objective-C code and write the Perl in parallel.
#import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { @autoreleasepool { int tester = 1; if (tester == 1){ printf("The tester value was %i\n", tester); } } return 0; }
Now here’s our Perl version:
#! /usr/bin/perl -w $tester = 1; if ($tester == 1){ printf("The tester value was %i\n", $tester); }
I needed to add the $ sigil and remove the int
declaration, but aside from that, nothing…
Next we’ll add some else
code to compare the two again:
#import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { @autoreleasepool { int tester = 2; if (tester == 1){ printf("The tester value was detected as 1\n"); }else if(tester == 2){ printf("The tester value was detected as 2\n"); }else{ printf("The tester value was %i\n", tester); } } return 0; }
And now into Perl:
#! /usr/bin/perl -w $tester = 2; if ($tester == 1){ printf("The tester value was detected as 1\n"); }elsif($tester == 2){ printf("The tester value was detected as 2\n"); }else{ printf("The tester value was %i\n", $tester); }
Small changes, note that Perl uses elsif
not else if
. Apparently there is some perfectly valid reason for the spelling of the Perl version!
The final Objective-C decision maker is the switch statement:
#import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { @autoreleasepool { int tester = 2; switch(tester){ case 1: printf("The tester value was detected as 1\n"); break; case 2: printf("The tester value was detected as 2\n"); break; default: printf("The tester value was %i\n", tester); break; } } return 0; }
And now the increasingly varied Perl:
#! /usr/bin/perl -w use 5.10.0; $tester = 2; given ($tester){ when (1){ printf("The tester value was detected as 1\n"); } when (2){ printf("The tester value was detected as 2\n"); } default { printf("The tester value was %i\n", $tester); } }
Perl never really had a ‘switch/case
so a module was added, which I believe is being depreciated. The ‘given/when
‘ has been borrowed from the illusive Perl 6 as of Perl 5.10, but in order to access the 5.10 features you have to use the use 5.10.0
line.
I tend to use this sort of test in the boolean form quite a lot in Perl. I only really want to know whether the test variable has a value or not, such as a return value from a function. Here is a bit of code in Objective-C which kind of illustrates what i mean:
#import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { @autoreleasepool { int tester; if(! tester) printf("tester has a value of %i\n", tester); } return 0; }
The output is: tester has a value of 0
I’ve done this slightly differently to show the different syntax. As there is only one line following the if
, we don’t need to use curly braces, and we an even just run it out on the same line, just to make it more confusing! Here is the Perl equivalent:
#! /usr/bin/perl -w $tester; if (! $tester){printf("tester has a value of %i\n", $tester)}
Same output as before.