Essential Perl

 

  • Program Stub / Typical Flow

#!/usr/bin/perl
open IN, “<”, inputfile.txt;
open OUT, “>”, outputfile.txt

if($#ARGV != 2) {
print “ERROR - need 2 args!\n”;
exit;
}

$arg1 = $ARGV[0];
$arg2 = $ARGV[1];

while(<IN) {
$l = $_;
chomp($l):

}
close IN;
close OUT;

  • Read/Write files

open FILE, "first2.txt" or die "Personalized error message!!!";
open FILE, "first2.txt" or die $!;   # generic error message will be stored in $! variable
open FILE, “>output.txt” or die $!”;

# to use a variable for the filename, it is easier to write the mode in it’s own comma-separated quotes like this:
open FILE, "<", $mine or die $!;
open OUT, ">>", $yours or die $!;

<file.txt (read but DON’T create or truncate/delete/overwrite)
>file.txt (write, create and truncate/overwrite)
>>file.txt (append or create)
* adding ‘+’ allows for simultaneous reading and writing
+< (read/write, but DON’T create or truncate/delete/overwrite)
+> (read/write, create and truncate/overwrite)
+>> (read/append or read/create-write)

-- check if a file exists
$file = ‘ /dir/file.txt’;
if (-e $file) {
  print “File exists!”;
}

- FILEHANDLE directly to array
- The file will only be read once per open statement so you can’t do @lines = <FILE> and then while(<FILE>) without closing FILE and re-opening it in between the two <FILE> lines of code.
my @lines = <FILE>;

  • Arrays

@myArray = ();

$length = @myArray;

if (exists $myArray[$ind]) #Value EXISTS, but may be undefined.
if(defined $myArray[$ind]) #Value is DEFINED, but may be false.
if($myArray[$ind]) #Value at array index $index is TRUE.

  • Hash

# initialize by assigning to an empty list
%hash = ();

# add value
$hash { ‘key' } = ‘value’;
$hash { $key} = $value;
# with vars

%hash = (
  key1 => $val1,
  key2 => $val2,
  key3 => $val3,
);

# reference values of hash
$href->{ ‘key’ } = ‘value’;
$href->{ $key } = $value;
# with vars

MORE ON HASHES AND HASH REFERENCES

keys()

value()

  • Sub routines

# call subroutine
$result = doSomething($input);

# actual subroutine
sub doSomething(){
  my $var1 = shift(@_);
  ….
  return $var2;
}

  • Regex

I remember pretty well

  • Loops

foreach (@myArray) {
  print $_;
}

foreach $item (@myArray) {   # use scalar as iterator for readability
  print $item;
}

$linecount++ while (<FILE>);

do {   # execute do statement before testing expression
  $calc += ($fact * $val);  # using an assignment operator
                                    # equivalent to $calc = $calc + ($fact * $val);
} while ($calc < 100);

 

split, push, pop, shift  etc??????

  • Good Resources

http://en.wikibooks.org/wiki/Perl_Programming/Operators
http://www.cs.mcgill.ca/~abatko/computers/programming/perl/howto/hash/
http://www.troubleshooters.com/codecorn/littperl/perlsub.htm
http://www.cs.cmu.edu/afs/cs/usr/rgs/mosaic/pl-predef.html Predefined names in Perl
http://cslibrary.stanford.edu/108/EssentialPerl.html
http://perldoc.perl.org/functions