UTOSC 2008/Perl Fundamentals

SelfGOL an entry in Obfuscated Perl Contest

Perl looks like "Line Noise"

It is really really easy to write bad code.

Compared to bash, Perl is very similar with a few changes. (ie. echo is now print)

When bash gets any logic, it is time to move on. Perl is an option. So is Python and command line PHP.

Very high level language (VHLL)

Perl was originally designed for reporting.

Comments with #. Exception: #!/usr/bin/perl

"sha-bang" #!

Hello world: print "Hello World\n"
 * 1) !/usr/bin/perl

Or perl -e "print 'Hello World!'\n"

Execute single command (for testing purposes): perl -e [command] perl -e "use strict;" perl -e "use DBD::pg;"

Code blocks. Lines should end with ';'

Bare words. Generally no longer allowed: print hello world;

Do in strict syntax. Don't allow bare variables. Require variables to be declared: use strict;

Send to standard error (useful for logging): warn "message"; warn "message\n";
 * 1) includes line number
 * 1) no line number

Exit codes: exit # return 0 exit 42 # return 42

Die (combination of warn and exit 255): die "this is dead" die

Variables:
 * Scalars - standard variable
 * Arrays - indexed list
 * Hashes - named indexed

Scalars $a = 'this is a test';

To convert a string number to a number multiply by 1: $a = '5'; $a = $a * 1;

Sigils determining data content. A sigil is an indicator as to the context of the variable that you are working with:
 * $ scalar
 * @ array
 * % hashes

String concatenation: $a = "hello". "world";

PHP is based off of Perl
 * dot '.' string concatination
 * dollar sign variables
 * die command

Single vs double quotes. Double quotes evaluate variables and escape characters. Single quote treats as exact. (except single quote can be ie 'bob\'s name')

Traditional operators:

Space saving operators:

Arrays (zero based): @a = (0, 1, "two", 3, 4, 5); # create array print @a[1..4];             # slice 1 - 4 print $a[3];                # scalar 3 $a[4] = "four";             # arrays are mutable; push $a, "six", 7, "eight"; # append to array @b = (9, 10);               # create second array @c = (@a, @b);              # create array of array push @a, @b;                # append @b to @a use Data::Dumper; print Dumper( @a );         # print @a in formatted list

Foreach: foreach $a ( @a ) { print $a. "\n"; } foreach ( @a ) { print $_. "\n"; } print "$_\n" for @a;        # compressed foreach
 * 1) $_ (default variable) is last variable used
 * 1) for and foreach are interchangable

Join and Split: print join(', ', @a); $c = join(':', @a); @d = split(/:/, $c);        # opposite of join
 * 1) join turns a list into a scalar
 * 1) split turns a scalar into a list

Hashes (associative array): %a = (     'father', 'anakin',      'son', 'luke', );  # can leave comma in last list; %a = (     'father' => 'anakin',      'son'    => 'luke', );  # can leave comma in last list; print $a{'father'}; print "$a{$_}" for keys %a;

List environment variables:
 * 1) todo

Perl can handle decimals. Bash can only do integers.

Conditionals: %jedi = (     'father' => 'anakin',      'son'    => 'luke', ); if ( $jedi{father} eq 'anakin' ) { ... } elseif (...) { ... } else { ... }

Comparison:
 * eq for strings
 * == for numbers

Numbers: $a = 1; $b = 2; if ($a = $b) { ... } # BAD CODE! force equal if ($a == $b) { ... }  # ok code

For loop counter:
 * 1) todo