Sie sind auf Seite 1von 76

Hyperpolyglot

Interpreted Languages: PHP, Perl, Python, Ruby (Sheet One) a side-by-side reference sheet sheet one: arithmetic and logic | strings | regexes | dates and time | arrays | dictionaries | functions | execution control files | directories | processes and environment sheet two: libraries and modules | objects | reflection | web | tests | debugging and profiling | java interop | contact php (1995) versions used 5.3 5.12; 5.14 use strict; $ perl --version $ perl foo.pl $ perl -de 0 $ perl -e 'print("hi\n")' perl (1987) 2.7; 3.2 import os, re, sys $ python -V $ python foo.py $ python $ python -c "print('hi')" newline or ; ; statements must be semicolon terminated inside {} block delimiters assignment {} {} newlines not separators inside (), [], {}, triple quote literals, or after backslash: \ offside rule assignments can be chained but otherwise don't return values: v=1 x, y, z = 1, 2, 3 # raises ValueError: x, y = 1, 2, 3 # raises ValueError: x, y, z = 1, 2 x, y = y, x # do not return values: += -= *= /= //= %= **= python (1991) 1.8; 1.9 none $ ruby --version $ ruby foo.rb $ irb $ ruby -e 'puts "hi"' newline or ; newlines not separators inside (), [], {}, ``, '', "", or after binary operator or backslash: \ {} do end v=1 x, y, z = 1, 2, 3 # 3 is discarded: x, y = 1, 2, 3 # z set to nil: x, y, z = 1, 2 x, y = y, x += -= *= /= none %= **= += *= ruby (1995)

implicit none prologue show version $ php --version interpreter repl command line script statement separator $ php -f foo.php $ php $ php -r 'echo "hi\n";' ;

$v = 1; list($x, $y, $z) = array(1 ,2, 3); # 3 is discarded: list($x, $y) = array(1, 2, 3); # $z set to NULL: list($x, $y, $z) = array(1, 2); list($x, $y) = array($y, $x); += -= *= none /= %= **= .= none

$v = 1; ($x, $y, $z) = (1, 2, 3); # 3 is discarded: ($x, $y) = (1, 2, 3); # $z set to undef: ($x, $y, $z) = (1, 2); ($x, $y) = ($y, $x); += -= *= none /= %= **= .= x=

parallel assignment

swap compound assignment

operators: arithmetic, string, logical, bit increment and decrement

&= |= none <<= >>= &= |= ^=

&&= ||= ^= <<= >>= &= |= ^=

+= *= &= |= ^= <<= >>= &= |= ^=

&&= ||= ^= <<= >>= &= |= ^=

$x = 1; $y = ++$x; $z = --$y;

my $x = 1; my $y = ++$x; my $z = --$y; my $v; my (@a, %d); my $x = 1; my ($y, $z) = (2, 3);

none

x=1 # x and y not mutated: y = x.succ z = y.pred v = nil a, d = [], {} x=1 y, z = 2, 3 top level: file class block module block method body nestable: anonymous function block anonymous block

# in function body: local $v = NULL; variable $a = array(); declarations $d = array(); $x = 1; list($y, $z) = array(2, 3);

# in function body: v = None a, d = [], {} x=1 y, z = 2, 3

regions which define local scope nestable (with use clause): anonymous function body

top level: function or method body

top level: file nestable: function body anonymous function body anonymous block our ($g1, $g2) = (7, 8); sub swap_globals { ($g1, $g2) = ($g2, $g1); } use constant PI => 3.14; nestable (read only): function or method body

global variable constant declaration to-end-ofline comment

list($g1, $g2) = array(7, 8); function swap_globals() { global $g1, $g2; list($g1, $g2) = array($g2, $g1); } define("PI", 3.14);

g1, g2 = 7, 8 def swap_globals(): global g1, g2 g1, g2 = g2, g1 # uppercase identifiers # constant by convention PI = 3.14 # comment

$g1, $g2 = 7, 8 def swap_globals $g1, $g2 = $g2, $g1 end # warning if capitalized # identifier is reassigned PI = 3.14 # comment =begin comment line another line =end nil v == nil v.nil? raises NameError

// comment # comment

# comment =for comment line another line =cut undef ! defined $v error under use strict; otherwise undef

comment out multiple /* comment line lines another line */ null null test undefined variable access NULL # case insensitive is_null($v) ! isset($v) NULL

use triple quote string literal: '''comment line another line''' None v == None v is None raises NameError

undefined test

same as null test; no distinction between undefined variables and variables set to NULL php

same as null test; no distinction between undefined variables and variables set to undef perl 1 "" undef 0 0.0 "" "0" () && || ! lower precedence: and or xor not $x > 0 ? $x : -$x numbers only: == != > < >= <= strings: eq ne gt lt ge le 0 <=> 1 "do" cmp "re" 7 + "12" 73.9 + ".037" "value: " . 8 + - * / none % **

not_defined = False try: v except NameError: not_defined = True arithmetic and logic python True False False None 0 0.0 '' [] {} and or not

! defined?(v)

ruby true false false nil && || ! lower precedence: and or not x > 0 ? x : -x

true and false falsehoods logical operators conditional expression comparison operators three value comparison

TRUE FALSE # case insensitve FALSE NULL 0 0.0 "" "0" array() && || ! lower precedence: and or xor $x > 0 ? $x : -$x == != or <> > < >= <= no conversion: === !== none

x if x > 0 else -x comparison operators are chainable: == != > < >= <= removed from Python 3: cmp(0, 1) cmp('do', 're') 7 + int('12') 73.9 + float('.037') 'value: ' + str(8) + - * / // % **

== != > < >= <= 0 <=> 1 "do" <=> "re" 7 + "12".to_i 73.9 + ".037".to_f "value: " + "8".to_s + - * x.fdiv(y) / % **

convert from 7 + "12" string, to 73.9 + ".037" string "value: " . 8 arithmetic operators + - * / none % pow(b,e)

integer division and (int) (13 / 5) divmod none float division

int ( 13 / 5 ) none

13 // 5 q, r = divmod(13, 5) float(13) / 5 # Python 3: 13 / 5 from math import sqrt, exp, log, \ sin, cos, tan, asin, acos, atan, atan2 import math int(x) int(round(x)) math.ceil(x)

13 / 5 q, r = 13.divmod(5) 13.to_f / 5 or 13.fdiv(5) include Math sqrt exp log sin cos tan asin acos atan atan2 x.to_i x.round x.ceil x.floor x.abs

13 / 5

13 / 5 use Math::Trig qw( tan asin acos atan); sqrt exp log sin cos tan asin acos atan atan2 # cpan -i Number::Format use Number::Format 'round'; use POSIX qw(ceil floor); int($x)

arithmetic functions

sqrt exp log sin cos tan asin acos atan atan2 (int)$x round($x) ceil($x) floor($x) abs($x)

arithmetic truncation

round($x, 0) ceil($x) floor($x) abs($x) use List::Util qw(min max); min(1,2,3) max(1,2,3) min and max $a = array(1,2,3) min($a) max($a) division by zero integer overflow float overflow min(1,2,3); max(1,2,3); @a = (1,2,3); min(@a); max(@a); error converted to float; use Math::BigInt to create arbitrary length integers inf

math.floor(x) abs(x)

min(1,2,3) max(1,2,3) min([1,2,3]) max([1,2,3])

[1,2,3].min [1,2,3].max

returns FALSE with warning

raises ZeroDivisionError

integer division raises ZeroDivisionError float division returns Infinity becomes arbitrary length integer of type Bignum

converted to float

becomes arbitrary length integer of type long

INF

raises OverflowError # raises ValueError: import math math.sqrt(-2)

Infinity

sqrt -2

NaN

error unless use Math::Complex in effect # returns complex float: import cmath cmath.sqrt(-2) from fractions import Fraction x = Fraction(22,7) x.numerator x.denominator z = 1 + 1.414j z.real z.imag import random int(rand() * 100) rand() none srand 17; my $sd = srand; srand($sd); random.randint(0,99) random.random() random.gauss(0,1) import random random.seed(17) sd = random.getstate()

raises Errno::EDOM

use Math::BigRat; rational numbers none my $x = Math::BigRat->new("22/7"); $x->numerator(); $x->denominator(); use Math::Complex; my $z = 1 + 1.414 * i; Re($z); Im($z);

require 'rational' x = Rational(22,7) x.numerator x.denominator require 'complex' z = 1 + 1.414.im z.real z.imag rand(100) rand none srand(17) sd = srand srand(sd)

complex numbers

none

random integer, rand(0,99) uniform lcg_value() float, normal none float set random srand(17); seed, get and restore seed none

random.setstate(sd) bit operators << >> & | ^ ~ << >> & | ^ ~ 0b101010 052 0x2a # cpan -i Math::BaseCalc use Math::BaseCalc; $c = new Math::BaseCalc(digits=> [0..6]); $c->to_base(42); $c->from_base("60"); strings php string literal "don't say \"no\"" 'don\'t say "no"' newline in literal "don't say \"no\"" 'don\'t say "no"' perl 'don\'t say "no"' "don't say \"no\"" "don't " 'say "no"' '''don't say "no"''' """don't say "no\"""" triple quote literals only python "don't say \"no\"" 'don\'t say "no"' "don't " 'say "no"' ruby << >> & | ^ ~ 0b101010 052 0x2a << >> & | ^ ~ 0b101010 052 0x2a

binary, octal, none and hex 052 literals 0x2a

base conversion

base_convert("42", 10, 7); base_convert("60", 7, 10);

none int("60", 7)

42.to_s(7) "60".to_i(7)

yes

yes

yes double quoted: \a \b \cx \e \f \n \r \s \t \v \xhh \ooo Ruby 1.9 double quoted: \uhhhh \u{hhhhh} single quoted: \' \\ count = 3 item = "ball" puts "#{count} #{item}s" s1 = %q(lorem ipsum) s2 = %Q(#{s1} dolor sit amet) "lorem %s %d %f" % ["ipsum",13,3.7] word = "amet" s = <<EOF lorem ipsum dolor sit #{word}

backslash escapes

double quoted: \f \n \r \t \v \xhh \$ \" \ooo single quoted: \' \\

double quoted: \a \b \cx \e \f \n \r \t \xhh \x{hhhh} \ooo single quoted: \' \\

single and double quoted: \newline \\ \' \" \a \b \f \n \r \t \v \ooo \xhh Python 3: \uhhhh \Uhhhhhhhh count = 3 item = 'ball' print('{count} {item}s'.format( **locals())) none 'lorem %s %d %f' % ('ipsum', 13, 3.7)

variable $count = 3; interpolation $item = "ball"; echo "$count ${item}s\n"; custom delimiters sprintf none $fmt = "lorem %s %d %f"; sprintf($fmt, "ipsum", 13, 3.7); $word = "amet"; $s = <<<EOF lorem ipsum dolor sit $word

my $count = 3; my $item = "ball"; print "$count ${item}s\n"; my $s1 = q(lorem ipsum); my $s2 = qq($s1 dolor sit amet); my $fmt = "lorem %s %d %f"; sprintf($fmt, "ipsum", 13, 3.7) $word = "amet"; $s = <<EOF; lorem ipsum dolor sit $word

fmt = 'lorem {0} {1} {2}' fmt.format('ipsum', 13, 3.7) none

here document

EOF; concatenate $s = "Hello, "; $s2 = $s . "World!"; replicate split, in two, with delimiters, into characters join

EOF my $s = "Hello, "; my $s2 = $s . "World!"; s = 'Hello, ' s2 = s + 'World!'

EOF s = "Hello, " s2 = s + "World!"

juxtaposition can be used to concatenate literals: juxtaposition can be used to concatenate literals: s2 = 'Hello, ' "World!" s2 ="Hello, " 'World!' hbar = '-' * 80 'do re mi fa'.split() 'do re mi fa'.split(None, 1) re.split('(\s+)', 'do re mi fa') list('abcd') ' '.join(['do', 're', 'mi', 'fa']) 'lorem'.upper() 'LOREM'.lower() 'lorem'.capitalize() ' lorem '.strip() ' lorem'.lstrip() 'lorem '.rstrip() hbar = "-" * 80 "do re mi fa".split "do re mi fa".split(/\s+/, 2) "do re mi fa".split(/(\s+)/) "abcd".split("") %w(do re mi fa).join(' ') "lorem".upcase "LOREM".downcase "lorem".capitalize " lorem ".strip " lorem".lstrip "lorem ".rstrip

$hbar = str_repeat("-", 80);

my $hbar = "-" x 80; split(/\s+/, "do re mi fa") split(/\s+/, "do re mi fa", 2) split(/(\s+)/, "do re mi fa"); split(//, "abcd") join(" ", qw(do re mi fa)) uc("lorem") lc("LOREM") ucfirst("lorem") # cpan -i Text::Trim use Text::Trim; trim " lorem " ltrim " lorem" rtrim "lorem " sprintf("%-10s", "lorem") sprintf("%10s", "lorem") length("lorem") index("lorem ipsum", "ipsum") rindex("do re re", "re") return -1 if not found substr("lorem ipsum", 6, 5)

explode(" ", "do re mi fa") preg_split('/\s+/', "do re mi fa", 2) preg_split('/(\s+)/', "do re mi fa", NULL, PREG_SPLIT_DELIM_CAPTURE); str_split("abcd") $a = array("do", "re", "mi", "fa"); implode(" ", $a) strtoupper("lorem") case strtolower("LOREM") manipulation ucfirst("lorem") trim(" lorem ") ltrim(" lorem") rtrim("lorem ")

strip

pad on right, str_pad("lorem", 10) on left str_pad("lorem", 10, " ", STR_PAD_LEFT) length strlen("lorem") index of substring extract substring strpos("do re re", "re") strrpos("do re re", "re") return FALSE if not found substr("lorem ipsum", 6, 5) syntax error to use index notation directly on string literal: $s = "lorem ipsum"; $s[6]; chr(65) ord("A") $ins = implode(range("a", "z")); $outs = substr($ins, 13, 13) . substr($ins, 0, 13); strtr("hello", $ins, $outs)

'lorem'.ljust(10) 'lorem'.rjust(10) len('lorem') 'do re re'.index('re') 'do re re'.rindex('re') raise ValueError if not found 'lorem ipsum'[6:11]

"lorem".ljust(10) "lorem".rjust(10) "lorem".length "lorem".size "do re re".index("re") "do re re".rindex("re") return nil if not found "lorem ipsum"[6, 5]

extract character chr and ord character translation

can't use index notation with strings: substr("lorem ipsum", 6, 1) chr(65) ord("A") $s = "hello"; $s =~ tr/a-z/n-za-m/;

'lorem ipsum'[6] chr(65) ord('A') from string import lowercase as ins from string import maketrans outs = ins[13:] + ins[:13]

"lorem ipsum"[6] 65.chr "A"[0] Ruby 1.9: "A".ord "hello".tr("a-z", "n-za-m")

php literal, custom '/lorem|ipsum/' delimited '(/etc/hosts)' literal character char class abbrevs: class . \d \D \h \H \s \S \v \V \w \W abbreviations and anchors anchors: ^ $ \A \b \B \z \Z if (preg_match('/1999/', $s)) { match test echo "party!\n"; } case insensitive preg_match('/lorem/i', "Lorem") match test modifiers eimsx substitution $s = "do re mi mi mi"; $s = preg_replace('/mi/', "ma", $s); match, prematch, postmatch /lorem|ipsum/ qr(/etc/hosts)

perl

'hello'.translate(maketrans(ins,outs)) regular expresions python re.compile('lorem|ipsum') none char class abbrevs: . \d \D \s \S \w \W anchors: ^ $ \A \b \B \Z if re.search('1999', s): print('party!') re.search('lorem', 'Lorem', re.I) re.I re.M re.S re.X s = 'do re mi mi mi' s = re.compile('mi').sub('ma', s) m = re.search('\d{4}', s) if m: match = m.group() prematch = s[0:m.start(0)] postmatch = s[m.end(0):len(s)] rx = '(\d{4})-(\d{2})-(\d{2})' m = re.search(rx, '2010-06-03') yr, mo, dy = m.groups() s = 'dolor sit amet' a = re.findall('\w+', s) none rx = re.compile('(\w+) (\w+)') rx.sub(r'\2 \1', 'do re') none dates and time python Time /lorem|ipsum/ %r(/etc/hosts)

ruby

char class abbrevs: . \d \D \h \H \s \S \v \V \w \W anchors: ^ $ \A \b \B \z \Z if ($s =~ /1999/) { print "party!\n"; } "Lorem" =~ /lorem/i imspx my $s = "do re mi mi mi"; $s =~ s/mi/ma/g; if ($s =~ /\d{4}/p) { $match = ${^MATCH}; $prematch = ${^PREMATCH}; $postmatch = ${^POSTMATCH}; } $rx = qr/(\d{4})-(\d{2})-(\d{2})/; "2010-06-03" =~ $rx; ($yr, $mo, $dy) = ($1, $2, $3); my $s = "dolor sit amet"; @a = $s =~ m/\w+/g; "do do" =~ /(\w+) \1/ my $s = "do re"; $s =~ s/(\w+) (\w+)/$2 $1/; /\(([^()]*|(?R))\)/

char class abbrevs: . \d \D \h \H \s \S \w \W anchors: ^ $ \A \b \B \z \Z if /1999/.match(s) puts "party!" end /lorem/i.match("Lorem") iomx s = "do re mi mi mi" s.gsub!(/mi/, "ma") m = /\d{4}/.match(s) if m match = m[0] prematch = m.pre_match postmatch = m.post_match end rx = /(\d{4})-(\d{2})-(\d{2})/ m = rx.match("2010-06-03") yr, mo, dy = m[1..3] a = "dolor sit amet".scan(/\w+/)

none

group capture

scan

backreferenc e in match $s = "do re"; and $rx = '/(\w+) (\w+)/'; substitution $s = preg_replace($rx, '\2 \1', $s); recursive '/\(([^()]*|($R))\)/' regex php date/time DateTime

$s = "2010-06-03"; $rx = '/(\d{4})-(\d{2})-(\d{2})/'; preg_match($rx, $s, $m); list($_, $yr, $mo, $dy) = $m; $s = "dolor sit amet"; preg_match_all('/\w+/', $s, $m); $a = $m[0]; preg_match('/(\w+) \1/', "do do")

/(\w+) \1/.match("do do") "do re".sub(/(\w+) (\w+)/, '\2 \1') Ruby 1.9: /(?<p>\(([^()]*|\g<p>)*\))/ ruby

perl Time::Piece if use Time::Piece in effect, otherwise datetime.datetime

type $t = new DateTime("now"); $utc_tmz = new DateTimeZone("UTC"); $utc = new DateTime("now", $utc_tmz);

tm array use Time::Piece; my $t = localtime(time); my $utc = gmtime(time); use Time::Local; use Time::Piece; my $epoch = timelocal($t); my $t2 = localtime(1304442000); $epoch = time; use Time::Piece; import datetime t = datetime.datetime.now() utc = datetime.datetime.utcnow() from datetime import datetime as dt epoch = int(t.strftime("%s")) t2 = dt.fromtimestamp(1304442000) import datetime epoch = t.to_i t2 = Time.at(1304442000) t = Time.now utc = Time.now.utc

current date/time

to unix $epoch = $t->getTimestamp(); epoch, from $t2 = new DateTime(); unix epoch $t2->setTimestamp(1304442000);

current unix $epoch = time(); epoch

t = datetime.datetime.now() epoch = int(t.strftime("%s"))

epoch = Time.now.to_i

strftime

strftime("%Y-%m-%d %H:%M:%S", $epoch); date("Y-m-d H:i:s", $epoch); $t->format("Y-m-d H:i:s");

$t = localtime(time); $fmt = "%Y-%m-%d %H:%M:%S"; print $t->strftime($fmt); Tue Aug 23 19:35:19 2011 use Time::Local; use Time::Piece; $s = "2011-05-03 10:00:00"; $fmt = "%Y-%m-%d %H:%M:%S"; $t = Time::Piece->strptime($s,$fmt); # cpan -i Date::Parse use Date::Parse; $epoch = str2time("July 7, 1999");

t.strftime('%Y-%m-%d %H:%M:%S')

t.strftime("%Y-%m-%d %H:%M:%S")

default format example

no default string representation

2011-08-23 19:35:59.411135 from datetime import datetime s = '2011-05-03 10:00:00' fmt = '%Y-%m-%d %H:%M:%S' t = datetime.strptime(s, fmt) # pip install python-dateutil import dateutil.parser s = 'July 7, 1999' t = dateutil.parser.parse(s)

2011-08-23 17:44:53 -0700 require 'date' s = "2011-05-03 10:00:00" fmt = "%Y-%m-%d %H:%M:%S" t = Date.strptime(s, fmt).to_time require 'date' s = "July 7, 1999" t = Date.parse(s).to_time

strptime

$fmt = "Y-m-d H:i:s"; $s = "2011-05-03 10:00:00"; $t = DateTime::createFromFormat($fmt, $s);

parse date w/o format

$epoch = strtotime("July 7, 1999");

DateInterval object if diff method used: $fmt = "Y-m-d H:i:s"; result of date $s = "2011-05-03 10:00:00"; subtraction $then = DateTime::createFromFormat($fmt, $s); $now = new DateTime("now"); $interval = $now->diff($then);

Time::Seconds object if use Time::Piece in effect; datetime.timedelta object not meaningful to subtract tm arrays

Float containing time difference in seconds

import datetime use Time::Seconds; add time duration $now = new DateTime("now"); $now->add(new DateInterval("PT10M3S"); $now = localtime(time); $now += 10 * ONE_MINUTE() + 3; delta = datetime.timedelta( minutes=10, seconds=3) t = datetime.datetime.now() + delta

require 'date/delta' s = "10 min, 3 s" delta = Date::Delta.parse(s).in_secs t = Time.now + delta

local timezone

DateTime objects can be instantiated without specifying the timezone if a default is set: $s = "America/Los_Angeles"; date_default_timezone_set($s);

Time::Piece has local timezone if created with a datetime object has no timezone information localtime and UTC timezone if created with unless a tzinfo object is provided when it is gmtime; tm arrays have no timezone or offset info created # cpan -i DateTime use DateTime; use DateTime::TimeZone;

if no timezone is specified the local timezone is used

import time tm = time.localtime() time.tzname[tm.tm_isdst] (time.timezone / -3600) + tm.tm_isdst tm.tm_isdst t.zone t.utc_offset / 3600 t.dst?

timezone $tmz = date_timezone_get($t); name; offset timezone_name_get($tmz); from UTC; is date_offset_get($t) / 3600; daylight $t->format("I"); savings?

$dt = DateTime->now(); $tz = DateTime::TimeZone->new( name=>"local"); $tz->name; $tz->offset_for_datetime($dt) / 3600; $tz->is_dst_for_datetime($dt); use Time::HiRes qw(gettimeofday); ($sec, $usec) = gettimeofday; a float argument will be truncated to an integer: sleep 1;

microsecond s sleep

list($frac, $sec) = explode(" ", microtime()); $usec = $frac * 1000 * 1000; a float argument will be truncated to an integer: sleep(1);

t.microsecond import time

t.usec

sleep(0.5) time.sleep(0.5) import signal, time class Timeout(Exception): pass def timeout_handler(signo, fm): raise Timeout() signal.signal(signal.SIGALRM, timeout_handler) try: signal.alarm(5) time.sleep(10) except Timeout: pass signal.alarm(0) require 'timeout' begin Timeout.timeout(5) do sleep(10) end rescue Timeout::Error end

timeout

eval { use set_time_limit to limit execution time of the $SIG{ALRM}= sub {die "timeout!";}; entire script; use stream_set_timeout to limit time alarm 5; spent reading from a stream opened with fopen or sleep 10; fsockopen }; alarm 0;

arrays php literal quote words size $a = array(1, 2, 3, 4); none count($a) @a = (1, 2, 3, 4); @a = qw(do re mi); $#a + 1 or scalar(@a) perl a = [1, 2, 3, 4] none len(a) python a = [1, 2, 3, 4] a = %w(do re mi) a.size a.length # same as size ruby

empty test lookup update

!$a $a[0] $a[0] = "lorem"; $a = array(); evaluates as NULL: $a[10]; increases array size to one: $a[10] = "lorem"; $a = array("x", "y", "z", "w"); $i = array_search("y", $a);

!@a $a[0] $a[0] = "lorem"; @a = (); evaluates as undef: $a[10]; increases array size to 11: $a[10] = "lorem"; use List::Util 'first'; @a = qw(x y z w); $i = first {$a[$_] eq "y"} (0..$#a); select 3rd and 4th elements: @a[2..3] splice(@a, 2, 2) @a[1..$#a] @a = (6,7,8); push @a, 9; pop @a; @a = (6,7,8); unshift @a, 5; shift @a; @a = (1,2,3); @a2 = (@a,(4,5,6)); push @a, (4,5,6); @a = (undef) x 10; use Storable 'dclone'

not a a[0] a[0] = 'lorem' a = [] raises IndexError: a[10] raises IndexError: a[10] = 'lorem' a = ['x', 'y', 'z', 'w'] i = a.index('y') select 3rd and 4th elements: a[2:4] none a[1:] a = [6,7,8] a.append(9) a.pop() a = [6,7,8] a.insert(0,5) a.pop(0) a = [1,2,3] a2 = a + [4,5,6] a.extend([4,5,6]) a = [None] * 10 a = [None for i in range(0, 10)] import copy a = [1,2,[3,4]] a2 = a a3 = list(a) a4 = copy.deepcopy(a) parameter contains address copy for i in [1,2,3]: print(i)

NoMethodError if a is nil: a.empty? a[0] a[0] = "lorem" a = [] evaluates as nil: a[10] increases array size to 11: a[10] = "lorem" a = %w(x y z w) i = a.index("y") select 3rd and 4th elements: a[2..3] a[2, 2] a[1..-1] a = [6,7,8] a.push(9) a << 9 # same as push a.pop a = [6,7,8] a.unshift(5) a.shift a = [1,2,3] a2 = a + [4,5,6] a.concat([4,5,6]) a = [nil] * 10 a = Array.new(10, nil) a = [1,2,[3,4]] a2 = a a3 = a.dup a4 = Marshal.load(Marshal.dump(a))

out-ofbounds behavior index of array element

slice by select 3rd and 4th elements: endpoints, by none length array_slice($a, 2, 2) slice to end manipulate back array_slice($a, 1)

$a = array(6,7,8); array_push($a, 9); $a[] = 9; # same as array_push array_pop($a); manipulate $a = array(6,7,8); front array_unshift($a, 5); array_shift($a); $a = array(1,2,3); concatenate $a2 = array_merge($a,array(4,5,6)); $a = array_merge($a,array(4,5,6)); replicate address copy, shallow copy, deep copy arrays as function arguments iteration $a = array(1,2,array(3,4)); $a2 =& $a; none $a4 = $a;

my @a = (1,2,[3,4]); my $a2 = \@a; my @a3 = @a; my @a4 = @{dclone(\@a)}; each element passed as separate argument; use reference to pass array as single argument for $i (1, 2, 3) { print "$i\n" }

parameter contains deep copy foreach (array(1,2,3) as $i) { echo "$i\n"; }

parameter contains address copy

[1,2,3].each { |i| puts i }

indexed iteration iterate over range instantiate range as array reverse

$a = array("do", "re", "mi" "fa"); foreach ($a as $i => $s) { echo "$s at index $i\n"; } not space efficient; use C-style for loop

none; use range iteration from 0 to $#a and use index to look up value in the loop body for $i (1..1_000_000) { code } @a = 1..10; @a = (1,2,3); reverse @a; @a = reverse @a; @a = qw(b A a B); sort @a; @a = sort @a; sort { lc($a) cmp lc($b) } @a; use List::MoreUtils 'uniq';

a = ['do', 're', 'mi', 'fa'] for i, s in enumerate(a): print('%s at index %d' % (s, i)) range replaces xrange in Python 3: for i in xrange(1, 1000001): code a = range(1, 11) Python 3: a = list(range(1, 11)) a = [1,2,3] a[::-1] a.reverse() a = ['b', 'A', 'a', 'B'] sorted(a) a.sort() a.sort(key=str.lower)

a = %w(do re mi fa) a.each_with_index do |s,i| puts "#{s} at index #{i}" end (1..1_000_000).each do |i| code end a = (1..10).to_a a = [1,2,3] a.reverse a.reverse! a = %w(b A a B) a.sort a.sort! a.sort do |x,y| x.downcase <=> y.downcase end a = [1,2,2,3] a2 = a.uniq a.uniq! a.include?(7) [1,2] & [2,3,4]

$a = range(1, 10); $a = array(1,2,3); array_reverse($a); $a = array_reverse($a); $a = array("b", "A", "a", "B"); none sort($a); none, but usort sorts in place

sort

dedupe

$a = array(1,2,2,3); $a2 = array_unique($a); $a = array_unique($a); in_array(7, $a)

my @a = (1,2,2,3); my @a2 = uniq @a; @a = uniq @a; 7 ~~ @a

a = [1,2,2,3] a2 = list(set(a)) a = list(set(a)) 7 in a {1,2} & {2,3,4}

membership intersection

$a = array(1,2); $b = array(2,3,4) array_intersect($a, $b) $a1 = array(1,2); union $a2 = array(2,3,4); array_unique(array_merge($a1, $a2)) relative $a1 = array(1,2,3); complement, $a2 = array(2); symmetric array_values(array_diff($a1, $a2)) difference none array_map(function ($x) { map return $x*$x; }, array(1,2,3)) array_filter(array(1,2,3), filter function ($x) { return $x>1; }) reduce array_reduce(array(1,2,3), function($x,$y) {

{1,2} | {2,3,4}

[1,2] | [2,3,4] require 'set'

{1,2,3} - {2} {1,2} ^ {2,3,4} map(lambda x: x * x, [1,2,3]) # or use list comprehension: [x*x for x in [1,2,3]] filter(lambda x: x > 1, [1,2,3]) # or use list comprehension: [x for x in [1,2,3] if x > 1] # import needed in Python 3 only from functools import reduce

[1,2,3] - [2] Set[1,2] ^ Set[2,3,4] [1,2,3].map { |o| o*o }

map { $_ * $_ } (1,2,3)

grep { $_ > 1 } (1,2,3) use List::Util 'reduce';

[1,2,3].select { |o| o > 1 }

[1,2,3].inject(0) { |m,o| m+o }

return $x+$y; }, 0) universal and existential use array_filter tests

reduce { $x + $y } 0, (1,2,3) reduce(lambda x, y: x+y, [1,2,3], 0) # cpan -i List::MoreUtils use List::MoreUtils qw(all any); all { $_ % 2 == 0 } (1,2,3,4) any { $_ % 2 == 0 } (1,2,3,4) use List::Util 'shuffle'; @a = (1, 2, 3, 4); shuffle(@a); none # cpan -i List::MoreUtils use List::MoreUtils 'zip'; @nums = (1, 2, 3); @lets = qw(a b c); # flat array of 6 elements: @a = zip @nums, @lets; dictionaries php perl %d = ( t => 1, f => 0 ); scalar(keys %d) $d{"t"} %d = (); evaluates as undef: $d{"lorem"}; adds key/value pair: $d{"lorem"} = "ipsum"; exists $d{"y"} %d = ( 1 => "t", 0 => "f" ); delete $d{1}; @a = (1,"a",2,"b",3,"c"); %d = @a; d = { 't':1, 'f':0 } len(d) d['t'] d = {} raises KeyError: d['lorem'] adds key/value pair: d['lorem'] = 'ipsum' 'y' in d d = {1: True, 0: False} del d[1] a = [[1,'a'], [2,'b'], [3,'c']] d = dict(a) a = [1,'a',2,'b',3,'c'] d = dict(zip(a[::2], a[1::2])) d1 = {'a':1, 'b':2} d2 = {'b':3, 'c':4} d1.update(d2) python ruby d = { "t" => 1, "f" => 0 } d.size d.length # same as size d["t"] d = {} evaluates as nil: d["lorem"] adds key/value pair: d["lorem"] = "ipsum" d.has_key?("y") d = {1 => true, 0 => false} d.delete(1) a = [[1,"a"], [2,"b"], [3,"c"]] d = Hash[a] a = [1,"a",2,"b",3,"c"] d = Hash[*a] d1 = {"a"=>1, "b"=>2} d2 = {"b"=>3, "c"=>4} d1.merge!(d2) all(i%2 == 0 for i in [1,2,3,4]) any(i%2 == 0 for i in [1,2,3,4]) from random import shuffle, sample a = [1, 2, 3, 4] shuffle(a) sample(a, 2) [1, 2, 3, 4].shuffle Ruby 1.9: [1, 2, 3, 4].sample(2) [1,2,3,4].all? {|i| i.even? } [1,2,3,4].any? {|i| i.even? }

shuffle and sample

$a = array(1, 2, 3, 4); shuffle($a); array_rand($a, 2)

zip

# array of 3 pairs: $a = array_map(NULL, array(1, 2, 3), array("a", "b", "c"));

# array of 3 pairs: a = zip([1,2,3], ['a', 'b', 'c'])

# array of 3 pairs: a = [1,2,3].zip(["a", "b", "c"])

literal size lookup out-ofbounds behavior is key present delete entry from array of pairs, from even length array merge

$d = array("t" => 1, "f" => 0); count($d) $d["t"] $d = array(); evaluates as NULL: $d["lorem"]; adds key/value pair: $d["lorem"] = "ipsum"; array_key_exists("y", $d); $d = array(1 => "t", 0 => "f"); unset($d[1]);

$d1 = array("a"=>1, "b"=>2); $d2 = array("b"=>3, "c"=>4); $d1 = array_merge($d1, $d2);

%d1 = (a=>1, b=>2); %d2 = (b=>3, c=>4); %d1 = (%d1, %d2);

invert

$to_num = array("t"=>1, "f"=>0); $to_let = array_flip($to_num);

%to_num = (t=>1, f=>0); %to_let = reverse %to_num;

iteration

foreach ($d as $k => $v ) { code }

while ( ($k, $v) = each %d ) { code }

to_num = {'t':1, 'f':0} # dict comprehensions added in 2.7: to_let = {v:k for k, v in to_num.items()} for k, v in d.iteritems(): code Python 3: for k, v in d.items(): code d.keys() d.values() Python 3: list(d.keys()) list(d.values()) from collections import defaultdict counts = defaultdict(lambda: 0) counts['foo'] += 1

to_num = {"t"=>1, "f"=>0} to_let = to_num.invert

d.each do |k,v| code end

keys and values as arrays

array_keys($d) array_values($d)

keys %d values %d

d.keys d.values

default value, computed value

$counts = array(); $counts['foo'] += 1; extend ArrayObject for computed values and defaults other than zero or empty string.

my %counts; $counts{'foo'} += 1 define a tied hash for computed values and defaults other than zero or empty string

class Factorial(dict): def __missing__(self, k): if k > 1: return k * self[k-1] else: return 1 factorial = Factorial()

counts = Hash.new(0) counts['foo'] += 1 factorial = Hash.new do |h,k| k > 1 ? k * h[k-1] : 1 end

functions php function declaration function add($a, $b) { return $a + $b; } add(1, 2); function invocation missing argument behavior function names are case insensitive: ADD(1, 2); set to NULL with warning perl sub add { $_[0] + $_[1] } sub add { my ($a, $b) = @_; $a + $b; } add(1, 2); parens are optional: add 1, 2; set to undef sub my_log { def add(a, b): return a+b python def add(a, b) a+b end parens are optional and customarily omitted when defining functions with no parameters add(1, 2) add(1, 2) parens are optional: add 1, 2 raises ArgumentError def my_log(x, base=10) ruby

raises TypeError import math

default value function my_log($x, $base=10) {

return log($x)/log($base); } my_log(42); my_log(42, M_E);

my $x = shift; my $base = shift // 10; log($x)/log($base); } my_log(42); my_log(42, exp(1));

def my_log(x, base=10): return math.log(x)/math.log(base) my_log(42) my_log(42, math.e)

Math.log(x)/Math.log(base) end my_log(42) my_log(42, Math::E)

variable number of arguments

function foo() { $arg_cnt = func_num_args(); if ($arg_cnt >= 1) { $n = func_get_arg(0); echo "first: " . $n . "\n"; } if ($arg_cnt >= 2) { $a = func_get_args(); $n = $a[$arg_cnt-1]; echo "last: " . $n . "\n"; } }

sub foo { if ( @_ >= 1 ) { print "first: $_[0]\n"; } if ( @_ >= 2 ) { print "last: $_[-1]\n"; } }

def foo(*a): if len(a) >= 1: print('first: ' + str(a[0])) if len(a) >= 2: print('last: ' + str(a[-1]))

def foo(*a) if a.size >= 1 puts "first: #{a[0]}" end if a.size >= 2 puts "last: #{a[-1]}" end end

named parameters

none

none

def fequal(x, y, **opts): eps = opts.get('eps') or 0.01 return abs(x - y) < eps fequal(1.0, 1.001) fequal(1.0, 1.001, eps=0.1**10)

def fequal(x, y, opts={}) eps = opts[:eps] || 0.01 (x - y).abs < eps end fequal(1.0, 1.001) fequal(1.0, 1.001, :eps=>0.1**10)

function foo(&$x, &$y) { $x += 1; pass number $y .= "ly"; or string by } reference $n = 7; $s = "hard"; foo($n, $s); function foo(&$x, &$y) { $x[2] = 5; pass array or $y["f"] = -1; dictionary by } reference $a = array(1,2,3); $d = array("t"=>1,"f"=>0); foo($a, $d); return value return arg or NULL multiple function first_and_second(&$a) { return values return array($a[0], $a[1]);

sub foo { $_[0] += 1; $_[1] .= "ly"; } my $n = 7; my $s = "hard"; foo($n, $s); sub foo { $_[0][2] = 5; $_[1]{"f"} = -1; } my @a = (1,2,3); my %d = ("t"=> 1, "f" => 0); foo(\@a, \%d); return arg or last expression evaluated sub first_and_second { return ($_[0], $_[1]);

not possible

not possible

def foo(x, y): x[2] = 5 y['f'] = -1 a = [1,2,3] d = {'t':1, 'f':0} foo(a, d) return arg or None def first_and_second(a): return a[0], a[1]

def foo(x, y) x[2] = 5 y["f"] = -1 end a = [1,2,3] d = {"t"=> 1, "f" => 0 } foo(a, d) return arg or last expression evaluated def first_and_second(a) return a[0], a[1]

lambda declaration lambda invocation function reference

} $a = array(1,2,3); list($x, $y) = first_and_second($a); $sqr = function ($x) { return $x * $x; }; $sqr(2) $func = "add";

} @a = (1,2,3); ($x, $y) = first_and_second(@a);

x, y = first_and_second([1,2,3])

end x, y = first_and_second([1,2,3])

$sqr = sub { $_[0] * $_[0] } $sqr->(2) my $func = \&add; use feature state;

body must be an expression: sqr = lambda x: x * x sqr(2) func = add # state not private: def counter(): counter.i += 1 return counter.i counter.i = 0 print(counter()) # Python 3: def make_counter(): i=0 def counter(): nonlocal i i += 1 return i return counter nays = make_counter()

sqr = lambda { |x| x * x } sqr.call(2) or sqr[2] func = lambda {|*args| add(*args)}

function counter() { static $i = 0; function with return ++$i; private state } echo counter();

sub counter { state $i = 0; ++$i; } print counter() . "\n";

none

closure

function make_counter() { $i = 0; return function () use (&$i) { return ++$i; }; } $nays = make_counter(); echo $nays();

sub make_counter { my $i = 0; return sub { ++$i }; } my $nays = make_counter; print $nays->() . "\n";

def make_counter i=0 return lambda { i +=1; i } end nays = make_counter puts nays.call

generator

none

none

def make_counter(): i=0 while True: i += 1 yield i nays = make_counter() print(nays.next())

# Ruby 1.9: def make_counter return Fiber.new do i=0 while true i += 1 Fiber.yield i end end end nays = make_counter puts nays.resume

decorator

def logcall(f): def wrapper(*a, **opts): print('calling ' + f.__name__) f(*a, **opts) print('called ' + f.__name__)

return wrapper @logcall def square(x): return x * x square(5) execution control php if ( 0 == $n ) { echo "no hits\n"; } elseif ( 1 == $n ) { echo "one hit\n"; } else { echo "$n hits\n"; } switch ($n) { case 0: echo "no hits\n"; break; case 1: echo "one hit\n"; break; default: echo "$n hits\n"; } while ( $i < 100 ) { $i++; } for ($i = 1; $i <= 10; $i++) { echo "$i\n"; } break continue none if ( 0 == $n ) { print "no hits\n" } elsif ( 1 == $n ) { print "one hit\n" } else { print "$n hits\n" } use feature 'switch'; given ($n) { when (0) { print "no hits\n"; } when (1) { print "one hit\n"; } default { print "$n hits\n"; } } perl if 0 == n: print('no hits') elif 1 == n: print('one hit') else: print(str(n) + ' hits') python if n == 0 puts "no hits" elsif 1 == n puts "one hit" else puts "#{n} hits" end case n when 0 puts "no hits" when 1 puts "one hit" else puts "#{n} hits" end while i < 100 do i += 1 end none ruby

if

switch

none

while

while ( $i < 100 ) { $i++ } for ( $i=0; $i <= 10; $i++ ) { print "$i\n"; } last next redo

while i < 100: i += 1 none

c-style for break, continue, redo control structure keywords what do does statement modifiers raise exception

break continue none

break next redo

case default do else elseif for foreach goto if switch while starts body of a do-while loop, a loop which checks the condition after the body is executed none throw new Exception("bad arg");

do else elsif for foreach goto if unless until while elif else for if while

case do else elsif end for loop when while unless until

executes following block and returns value of last raises NameError unless a value was assigned to starts an anonymous block. Also starts the body of statement executed it a loop, while, or until loop print "positive\n" if $i > 0; print "nonzero\n" unless $i == 0; die "bad arg"; none raise Exception('bad arg') puts "positive" if i > 0 puts "nonzero" unless i == 0 # raises RuntimeError raise "bad arg"

catch exception

try { risky(); } catch (Exception $e) { echo "risky failed: ", $e->getMessage(), "\n"; }

eval { risky }; if ($@) { print "risky failed: $@\n"; }

try: risky() except: print('risky failed')

# catches StandardError begin risky rescue print "risky failed: " puts $!.message end last exception: $! backtrace array of exc.: $@ exit status of child: $? class Bam < Exception def initialize super("bam!") end end begin raise Bam.new rescue Bam => e puts e.message end acquire_resource begin risky ensure release_resource end

global variable for last exception

none

$EVAL_ERROR: $@ $OS_ERROR: $! $CHILD_ERROR: $?

last exception: sys.exc_info()[1]

class Bam extends Exception { function __construct() { define parent::__construct("bam!"); exception } } try { catch throw new Bam; exception by } catch (Bam $e) { type echo $e->getMessage(), "\n"; } finally/ensur e none

none

class Bam(Exception): def __init__(self): super(Bam, self).__init__('bam!') try: raise Bam() except Bam as e: print(e) acquire_resource() try: risky() finally: release_resource() class sleep10(threading.Thread): def run(self): time.sleep(10) thr = sleep10() thr.start() thr.join() files

none

none

use threads; start thread none $func = sub { sleep 10 }; $thr = threads->new($func);

thr = Thread.new { sleep 10 }

wait on thread

none

$thr->join;

thr.join

php print to standard output read from standard input echo "Hello, World!\n";

perl print "Hello, World!\n"; print('Hello, World!')

python puts "Hello, World!"

ruby

$line = fgets(STDIN);

$line = <STDIN>;

line = sys.stdin.readline()

line = gets

standard file only set by CLI; not set when reading script from handles standard input: STDIN STDOUT STDERR STDIN STDOUT STDERR open file open my $f, "/etc/hosts"; or $f = fopen("/etc/hosts", "r"); open FILE, "/etc/hosts"; open file for open my $f, ">/tmp/perl_test"; or writing $f = fopen("/tmp/php_test", "w"); open FILE, ">/tmp/perl_test"; close file read line iterate over file by line chomp read entire file into array or string write to file flush file handle file test, regular file test fclose($f); $line = fgets($f); while (!feof($f)) { $line = fgets($f); chop($line); $a = file("/etc/hosts"); $s = file_get_contents("/etc/hosts"); fwrite($f, "lorem ipsum"); note that CLI output isn't buffered fflush($f); file_exists("/etc/hosts") is_file("/etc/hosts") close $f; or close FILE; $line = <$f>; or $line = <FILE>; while ($line = <$f>) { chomp $line; @a = <$f>; $s = do { local $/; <$f> }; print $f "lorem ipsum"; use IO::Handle;

sys.stdin sys.stdout sys.stderr f = open('/etc/hosts') f = open('/tmp/test', 'w') f.close() f.readline() for line in f: line = line.rstrip('\r\n') a = f.readlines() s = f.read() f.write('lorem ipsum') f.flush()

$stdin $stdout $stderr f = File.open("/etc/hosts") or File.open("/etc/hosts") { |f| f = File.open('/tmp/test', 'w') or File.open('/tmp/test', 'w') { |f| f.close f.gets f.each do |line| line.chomp! a = f.lines.to_a s = f.read f.write("lorem ipsum") f.flush

$f->flush(); -e "/etc/hosts" -f "/etc/hosts" use File::Copy; os.path.exists('/etc/hosts') os.path.isfile('/etc/hosts') import shutil shutil.copy('/tmp/foo', '/tmp/bar') os.remove('/tmp/foo') shutil.move('/tmp/bar', '/tmp/foo') os.chmod('/tmp/foo', 0755) import tempfile f = tempfile.NamedTemporaryFile( prefix='foo') f.write('lorem ipsum\n') f.close() print("tmp file: %s" % f.name) File.exists?("/etc/hosts") File.file?("/etc/hosts") require 'fileutils' FileUtils.cp("/tmp/foo", "/tmp/bar") FileUtils.rm("/tmp/foo") FileUtils.mv("/tmp/bar", "/tmp/foo") File.chmod(0755, "/tmp/foo") require 'tempfile' f = Tempfile.new('foo') f.puts "lorem ipsum" f.close puts "tmp file: #{f.path}"

copy file, copy("/tmp/foo", "/tmp/bar"); remove file, unlink("/tmp/foo"); rename file rename("/tmp/bar", "/tmp/foo"); set file chmod("/tmp/foo", 0755); permissions $tmp = tempnam(sys_get_temp_dir(), "foo"); $f = fopen($tmp, "w"); fwrite($f, "lorem ipsum\n"); fclose($f); echo "tmp file: $tmp\n";

copy("/tmp/foo", "/tmp/bar"); unlink "/tmp/foo"; move("/tmp/bar", "/tmp/foo"); chmod 0755, "/tmp/foo"; use File::Temp; $f = File::Temp->new(); print $f "lorem ipsum\n"; close $f; print "tmp file: "; print $f->filename . "\n";

temporary file

in memory file

$meg = 1024 * 1024; $mem = "php://temp/maxmemory:$meg"; $f = fopen($mem, "r+"); fputs($f, "lorem ipsum"); rewind($f); $s = fread($f, $meg); php

from StringIOimport StringIO my ($f, $s); open($f, ">", \$s); print $f "lorem ipsum\n"; $s; directories perl use File::Spec; python os.path.join('/etc', 'hosts') File::Spec->catfile("/etc", "hosts") use File::Basename; print dirname("/etc/hosts"); print basename("/etc/hosts"); use Cwd; Cwd::abs_path("..") use File::Basename; while ( </etc/*> ) { print basename($_) . "\n"; } use File::Path 'make_path'; for filename in os.listdir('/etc'): print(filename) os.path.dirname('/etc/hosts') os.path.basename('/etc/hosts') f = StringIO() f.write('lorem ipsum\n') s = f.getvalue() Python 3 moved StringIO to the io module

require 'stringio' f = StringIO.new f.puts("lorem ipsum") f.rewind s = f.read ruby File.join("/etc", "hosts")

build pathname

"/etc" . DIRECTORY_SEPARATOR . "hosts"

dirname and dirname("/etc/hosts") basename basename("/etc/hosts") absolute pathname

File.dirname("/etc/hosts") File.basename("/etc/hosts")

realpath("..")

os.path.abspath('..')

File.expand_path("..")

if ($dir = opendir("/etc")) { while ($file = readdir($dir)) { iterate over echo "$file\n"; directory by } file closedir($dir); } make directory mkdir("/tmp/foo/bar", 0755, TRUE);

Dir.open("/etc").each do |file| puts file end require 'fileutils' FileUtils.mkdir_p("/tmp/foo/bar") require 'fileutils' FileUtils.cp_r("/tmp/foodir", "/tmp/bardir") File.rmdir("/tmp/foodir") require 'fileutils' FileUtils.rm_rf("/tmp/foodir") File.directory?("/tmp")

recursive copy

make_path "/tmp/foo/bar"; # cpan -i File::Copy::Recursive use File::Copy::Recursive 'dircopy'; none dircopy "/tmp/foodir", "/tmp/bardir"; rmdir "/tmp/foodir"; use File::Path 'remove_tree'; remove_tree "/tmp/foodir"; -d "/tmp" php perl scalar(@ARGV) $ARGV[0] $ARGV[1] etc

dirname = '/tmp/foo/bar' if not os.path.isdir(dirname): os.makedirs(dirname) import shutil shutil.copytree('/tmp/foodir', '/tmp/bardir') os.rmdir('/tmp/foodir') import shutil shutil.rmtree('/tmp/foodir') os.path.isdir('/tmp')

remove empty rmdir("/tmp/foodir"); directory remove directory and none contents directory test is_dir("/tmp")

processes and environment python len(sys.argv)-1 sys.argv[1] sys.argv[2] etc ruby ARGV.size ARGV[0] ARGV[1] etc command line args, count($argv) $argv[0] $argv[1] etc

script name

$_SERVER["SCRIPT_NAME"]

$0

sys.argv[0]

$0 require 'getoptlong'

$opts = getopt("f:h", array("file:", "help")); if ( array_key_exists("h", $opts) || array_key_exists("help", $opts) ) { getopt $script = $_SERVER["SCRIPT_NAME"]; echo "usage: $script -f SRC -h\n"; exit -1; } $src = $opts["f"] ? $opts["f"] : $opts["file"];

use Getopt::Long; my ($src, $help); sub usage { print "usage: $0 --f SRC\n"; exit -1; } GetOptions("file=s" => \$src, "help" => \$help); usage if $help; import argparse parser = argparse.ArgumentParser() parser.add_argument('--file', '-f', dest='file') args = parser.parse_args() src = args.file

opts = GetoptLong.new( ['--help', '-h', GetoptLong::NO_ARGUMENT], ['--file', '-f', GetoptLong::REQUIRED_ARGUMENT] ) opts.each do |opt, arg| case opt when '--file' src = arg when '--help' puts "usage: #{$0} -f SRC" exit -1 end end ENV["HOME"] ENV["PATH"] = "/bin" exit(0) Signal.trap("INT", lambda do |signo| puts "exiting" exit end ) File.executable?("/bin/ls") unless system("ls -l /tmp") raise "ls failed" end path = gets path.chomp! unless system("ls", "-l", path) raise "ls failed" end files = `ls -l /tmp` unless $?.success?

get and set getenv("HOME") environment variable putenv("PATH=/bin"); exit exit 0;

$ENV{"HOME"} $ENV{"PATH") = "/bin"; exit 0;

os.getenv('HOME') os.environ['PATH'] = '/bin' sys.exit(0) import signal

set signal handller

$SIG{INT} = sub { die "exiting\n"; };

def handler(signo, frame): print('exiting') exit -1 signal.signal(signal.SIGINT, handler) os.access('/bin/ls', os.X_OK) if os.system('ls -l /tmp'): raise Exception('ls failed') import subprocess cmd = ['ls', '-l', '/tmp'] if subprocess.call(cmd): raise Exception('ls failed') import subprocess

executable test external command

is_executable("/bin/ls") system("ls -l /tmp", $retval); if ($retval) { throw new Exception("ls failed"); } $path = chop(fgets(STDIN)); $safe = escapeshellarg($path); system("ls -l " . $safe, $retval); if ($retval) { throw new Exception("ls failed"); } $files = `ls -l /tmp`;

-x "/bin/ls" system("ls -l /tmp") == 0 or die "ls failed";

escaped external command

$path = <>; chomp($path); system("ls", "-l", $path) == 0 or die "ls failed"; my $files = `ls -l /tmp`; or my $files = qx(ls);

backticks

cmd = ['ls', '-l', '/tmp'] files = subprocess.check_output(cmd)

raise "ls failed" end

files = %x(ls) unless $?.success? raise "ls failed" end ________________________________________ ________________________________________ ________________________________________ ________________________________________ __ __ __ __ sheet two: libraries and modules | objects | reflection | web | tests | debugging and profiling | java interop

General Footnotes
versions used
The versions used for testing code in the reference sheet.

implicit prologue
Code which examples in the sheet assume to have already been executed. perl: We adopt the convention that if an example uses a variable without declaring it, it should be taken to have been previously declared with my. python: To keep the examples short we assume that os, re, and sys are always imported.

show version
How to get the version. php: The function phpversion() will return the version number as a string. perl: Also available in the predefined variable $], or in a different format in $^V and $PERL_VERSION. python: The following function will return the version number as a string:

import platform platform.python_version()

ruby: Also available in the global constant VERSION (Ruby 1.8) or RUBY_VERSION (Ruby 1.9).

interpreter
The customary name of the interpreter and how to invoke it. php:
php -f

will only execute portions of the source file within a <?php php code ?> tag as php code. Portions of the source file outside of such tags is not treated as executable code and is echoed to standard out.

If short tags are enabled, then php code can also be placed inside <? php code ?> and <?= php code ?> tags. <?= php code ?> is identical to <?php echo php code ?>.

repl
The customary name of the repl. php: The php REPL does not save or display the result of an expression.
php -a

offers a different style of interactive mode. It collects input until EOF is encountered and then it executes it. Text inside <? code ?> and <?= code ?> is executed as PHP code. Text outside of PHP markup tags is

echoed. perl: The Perl REPL perl -de 0 does not save or display the result of an expression. perl -d is the Perl debugger and perl -e runs code provided on the command line.
perl -de 0

does not by default have readline, but it can be added:

$ cpan -i Term::Readline::Perl <cpan output omitted> $ perl -de 0 DB<1> use Term::Readline::Perl; DB<2> print 1 + 1; 2

python:

The python repl saves the result of the last statement in _. ruby:
irb

saves the result of the last statement in _.

command line script


How to pass the code to be executed to the interpreter as a command line argument.

statement separator
How the parser determines the end of a statement. php: Inside braces statements must be terminated by a semicolon. The following causes a parse error:
<? if (true) { echo "true" } ?>

The last statement inside <?= ?> or <? ?> tags does not need to be semicolon terminated, however. The following code is legal:
<?= $a = 1 ?> <? echo $a ?>

perl: In a script statements are separated by semicolons and never by newlines. However, when using 'perl -de 0', a newline terminates the statement. python: Newline does not terminate a statement when:

inside parens inside list [] or dictionary {} literals

Python single quote '' and double quote "" strings cannot contain newlines except as the two character escaped form \n. Putting a newline in these strings results in a syntax error. There is however a multi-line string literal which starts and ends with three single quotes ''' or three double quotes: """. A newline that would normally terminate a statement can be escaped with a backslash. ruby: Newline does not terminate a statement when:

inside single quotes '', double quotes "", backticks ``, or parens () after an operator such as + or , that expects another argument

Ruby permits newlines in array [] or hash literals, but only after a comma , or associator =>. Putting a newline before the comma or associator results in a syntax error. A newline that would normally terminate a statement can be escaped with a backslash.

block delimiters
How blocks are delimited. perl: Curly brackets {} delimit blocks. They are also used for:

hash literal syntax which returns a reference to the hash: $rh = { 'true' => 1, 'false' => 0 } hash value lookup: $h{'true'}, $rh->{'true'} variable name delimiter: $s = "hello"; print "${s}goodbye";

python: Python blocks begin with a line that ends in a colon. The block ends with the first line that is not indented further than the initial line. Python raises an IndentationError if the statements in the block that are not in a nested block are not all indented the same. Using tabs in Python source code is unrecommended and many editors replace them automatically with spaces. If the Python interpreter encounters a tab, it is treated as 8 spaces. The python repl switches from a >>> prompt to a prompt inside a block. A blank line terminates the block. ruby: Curly brackets {} delimit blocks. A matched curly bracket pair can be replaced by the do and end keywords. By convention curly brackets are used for one line blocks. The end keyword also terminates blocks started by def, class, or module. Curly brackets are also used for hash literals, and the #{ } notation is used to interpolate expressions into strings.

assignment
How to assign a value to a variable. perl: Assignment operators have right precedence and evaluate to the right argument, so assignments can be chained:
$a = $b = 3;

python: If the variable on the left has not previously been defined in the current scope, then it is created. This may hide a variable in a containing scope.

Assignment does not return a value and cannot be used in an expression. Thus, assignment cannot be used in a conditional test, removing the possibility of using assignment (=) in place of an equality test (==). Assignments can nevertheless be chained to assign a value to multiple variables:
a = b = 3

ruby: Assignment operators have right precedence and evaluate to the right argument, so they can be chained. If the variable on the left does not exist, then it is created.

parallel assignment
How to assign values to variables in parallel. python: The r-value can be a list or tuple:
nums = [1,2,3] a,b,c = nums more_nums = (6,7,8) d,e,f = more_nums

Nested sequences of expression can be assigned to a nested sequences of l-values, provided the nesting matches. This assignment will set a to 1, b to 2, and c to 3:
(a,[b,c]) = [1,(2,3)]

This assignment will raise a TypeError:


(a,(b,c)) = ((1,2),3)

In Python 3 the splat operator * can be used to collect the remaining right side elements in a list:
x, y, *z = 1, 2 x, y, *z = 1, 2, 3 x, y, *z = 1, 2, 3, 4 # assigns [] to z # assigns [3] to z # assigns [3, 4] to z

ruby: The r-value can be an array:


nums = [1,2,3] a,b,c = nums

swap
How to swap the values held by two variables.

compound assignment

Compound assignment operators mutate a variable, setting it to the value of an operation which takes the value of the variable as an argument. First row: arithmetic operator assignment: addition, subtraction, multiplication, (float) division, integer division, modulus, and exponentiation. Second row: string concatenation assignment and string replication assignment Third row: logical operator assignment: and, or, xor Fourth row: bit operator assignment: left shift, right shift, and, or, xor. python: Python compound assignment operators do not return a value and hence cannot be used in expressions.

increment and decrement


The C-style increment and decrement operators can be used to increment or decrement values. They return values and thus can be used in expressions. The prefix versions return the value in the variable after mutation, and the postfix version return the value before mutation. Incrementing a value two or more times in an expression makes the order of evaluation significant:
x = 1; foo(++x, ++x); // foo(2, 3) or foo(3, 2)? x = 1; y = ++x/++x; // y = 2/3 or y = 3/2?

Python avoids the problem by not having an in-expression increment or decrement. Ruby mostly avoids the problem by providing a non-mutating increment and decrement. However, here is a Ruby expression which is dependent on order of evaluation:
x = 1 y = (x += 1)/(x += 1)

php: The increment and decrement operators also work on strings. There are postfix versions of these operators which evaluate to the value before mutation:
$x = 1; $x++; $x--;

perl: The increment and decrement operators also work on strings. There are postfix versions of these operators which evaluate to the value before mutation:
$x = 1; $x++; $x--;

ruby: The Integer class defines succ, pred, and next, which is a synonym for succ.

The String class defines succ, succ!, next, and next!. succ! and next! mutate the string.

local variable declarations


How to declare variables which are local to the scope defining region which immediately contain them. php: Variables do not need to be declared and there is no syntax for declaring a local variable. If a variable with no previous reference is accessed, its value is NULL. perl: Variables don't need to be declared unless use strict is in effect. If not initialized, scalars are set to undef, arrays are set to an empty array, and hashes are set to an empty hash. Perl can also declare variables with local. These replace the value of a global variable with the same name, if any, for the duration of the enclosing scope, after which the old value is restored. local declarations became obsolete with the introduction of the my declaration introduced in Perl 5. python: A variable is created by assignment if one does not already exist. If the variable is inside a function or method, then its scope is the body of the function or method. Otherwise it is a global. ruby: Variables are created by assignment. If the variable does not have a dollar sign ($) or ampersand (@) as its first character then its scope is scope defining region which most immediately contains it. A lower case name can refer to a local variable or method. If both are defined, the local variable takes precedence. To invoke the method make the receiver explicit: e.g. self.name. However, outside of class and modules local variables hide functions because functions are private methods in the class Object. Assignment to name will create a local variable if one with that name does not exist, even if there is a method name.

regions which define local scope


A list of regions which define a scope for the local variables they contain. Local variables defined inside the region are only in scope while code within the region is executing. If the language does not have closures, then code outside the region has no access to local variables defined inside the region. If the language does have closures, then code inside the region can make local variables accessible to code outside the region by returning a reference. A region which is top level hides local variables in the scope which contains it from the code it contains. A region can also be top level if the syntax requirements of the language prohibit it from being placed inside another scope defining region. A region is nestable if it can be placed inside another scope defining region, and if code in the inner region can access local variables in the outer region. php: Only function bodies and method bodies define scope. Function definitions can be nested, but when this is done lexical variables in the outer function are not visible to code in the body of the inner function.

Braces can be used to set off blocks of codes in a manner similar to the anonymous blocks of Perl. However, these braces do not define a scope. Local variables created inside the braces will be visible to subsequent code outside of the braces. Local variables cannot be created in class bodies. perl: A local variable can be defined outside of any function definition or anonymous block, in which case the scope of the variable is the file containing the source code. In this way Perl resembles Ruby and contrasts with PHP and Python. In PHP and Python, any variable defined outside a function definition is global. In Perl, when a region which defines a scope is nested inside another, then the inner region has read and write access to local variables defined in the outer region. Note that the blocks associated with the keywords if, unless, while, until, for, and foreach are anonymous blocks, and thus any my declarations in them create variables local to the block. python: Only functions and methods define scope. Function definitions can be nested. When this is done, inner scopes have read access to variables defined in outer scopes. Attempting to write (i.e. assign) to a variable defined in an outer scope will instead result in a variable getting created in the inner scope. Python trivia question: what would happen if the following code were executed?
def foo(): v = 1 def bar(): print(v) v = 2 print(v) bar() foo()

ruby: Note that though the keywords if, unless, case, while, and until each define a block which is terminated by an end keyword, none of these blocks have their own scope. Anonymous functions can be created with the lambda keyword. Ruby anonymous blocks can be provided after a function invocation and are bounded by curly brackets { } or the do and end keywords. Both anonymous functions and anonymous blocks can have parameters which are specified at the start of the block within pipes. Here are some examples:
id = lambda { |x| x } [3,1,2,4].sort { |a,b| a <=> b } 10.times do |i| print "#{i}..." end

In Ruby 1.8, the scope of the parameter of an anonymous block or function or block is local to the block or function body if the name is not already bound to a variable in the containing scope. However, if it is, then the variable in the containing scope will be used. This behavior was changed in Ruby 1.9 so that parameters are always local to function body or block. Here is an example of code which behaves differently under Ruby 1.8 and Ruby 1.9:
x = 3 id = lambda { |x| x } id.call(7) puts x # 1.8 prints 7; 1.9 prints 3

Ruby 1.9 also adds the ability mark variables as local, even when they are already defined in the containing scope. All such variables are listed inside the parameter pipes, separated from the parameters by a semicolon:
x = 3 noop = lambda { |; x| x = 15 } # bad syntax under 1.8 noop.call # x is still 3

global variable
How to declare and access a variable with global scope. php: A variable is global if it is used at the top level (i.e. outside any function definition) or if it is declared inside a function with the global keyword. A function must use the global keyword to access the global variable. perl: Undeclared variables, which are permitted unless use strict is in effect, are global. If use strict is in effect, a global can be declared at the top level of a package (i.e. outside any blocks or functions) with the our keyword. A variable declared with my inside a function will hide a global with the same name, if there is one. python: A variable is global if it is defined at the top level of a file (i.e. outside any function definition). Although the variable is global, it must be imported individually or be prefixed with the module name prefix to be accessed from another file. To be accessed from inside a function or method it must be declared with the global keyword. ruby: A variable is global if it starts with a dollar sign: $.

constant declaration
How to declare a constant. php: A constant can be declared inside a class:
class Math { const pi = 3.14; }

Refer to a class constant like this:


Math::pi

ruby:

Capitalized variables contain constants and class/module names. By convention, constants are all caps and class/module names are camel case. The ruby interpreter does not prevent modification of constants, it only gives a warning. Capitalized variables are globally visible, but a full or relative namespace name must be used to reach them: e.g. Math::PI.

to-end-of-line comment
How to create a comment that ends at the next newline.

comment out multiple lines


How to comment out multiple lines. python: The triple single quote ''' and triple double quote """ syntax is a syntax for string literals.

null
The null literal.

null test
How to test if a variable contains null. php: $v == NULL does not imply that $v is NULL, since any comparison between NULL and a falsehood will return true. In particular, the following comparisons are true:
$v = NULL; if ($v == NULL) { echo "true"; } $v = 0; if ($v == NULL) { echo "sadly true"; } $v = ''; if ($v == NULL) { echo "sadly true"; }

perl: $v == undef does not imply that $v is undef. Any comparison between undef and a falsehood will return true. The following comparisons are true:
$v = undef; if ($v == undef) { print "true"; } $v = 0; if ($v == undef) { print "sadly true"; } $v = ''; if ($v == undef) { print "sadly true"; }

undefined variable access


The result of attempting to access an undefined variable.

undefined test
php: A test showing that isset is the logical negation of is_null. perl: Perl does not distinguish between unset variables and variables that have been set to undef. In perl, calling defined($a) does not result in a error if $a is undefined, even with the strict pragma.

Arithmetic and Logic Footnotes


true and false
Literals for the booleans. These are the return values of the comparison operators. php: Any identifier which matches TRUE case-insensitive can be used for the TRUE boolean. Similarly for FALSE. In general, PHP variable names are case-sensitive, but function names are case-insensitive. When converted to a string for display purposes, TRUE renders as "1" and FALSE as "". The equality tests TRUE == 1 and FALSE == "" evaluate as TRUE but the equality tests TRUE === 1 and FALSE === "" evaluate as FALSE.

falsehoods
Values which behave like the false boolean in a conditional context. Examples of conditional contexts are the conditional clause of an if statement and the test of a while loop. python: Whether a object evaluates to True or False in a boolean context can be customized by implementing a __nonzero__ (Python 2) or __bool__ (Python 3) instance method for the class.

logical operators
Logical and, or, and not.

php, perl, ruby: && and || have higher precedence than assignment, compound assignment, and the ternary operator (?:), which have higher precedence than and and or.

conditional expression
How to write a conditional expression. A ternary operator is an operator which takes three arguments. Since condition ? true value : false value is the only ternary operator in C, it is unambiguous to refer to it as the ternary operator. python: The Python conditional expression comes from Algol. ruby: The Ruby if statement is also an expression:
x = if x > 0 x else -x end

comparison operators
Equality, inequality, greater than, less than, greater than or equal, less than or equal. Also known as the relational operators. php: Most of the comparison operators will convert a string to a number if the other operand is a number. Thus 0 == "0" is true. The operators === and !== do not perform this conversion, so 0 === "0" is false. perl: The operators: == != > < >= <= convert strings to numbers before performing a comparison. Many string evaluate as zero in a numeric context and are equal according to the == operator. To perform a lexicographic string comparison, use: eq, ne, gt, lt, ge, le. python: Comparison operators can be chained. The following expressions evaluate to true:
1 < 2 < 3 1 == 1 != 2

In general if Ai are expressions and opi are comparison operators, then


A1 op1 A2 op2 A3 An opn An+1

is true if and only if each of the following is true


A1 op1 A2 A2 op2 A3

An opn An+1

three value comparison


Binary comparison operators which return -1, 0, or 1 depending upon whether the left argument is less than, equal to, or greater than the right argument. The <=> symbol is called the spaceship operator.

convert from string, to string


How to convert string data to numeric data and vice versa. php: PHP converts a scalar to the desired type automatically and does not raise an error if the string contains non-numeric data. If the start of the string is not numeric, the string evaluates to zero in a numeric context. perl: Perl converts a scalar to the desired type automatically and does not raise an error if the string contains non-numeric data. If the start of the string is not numeric, the string evaluates to zero in a numeric context. python: float and int raise an error if called on a string and any part of the string is not numeric. ruby: to_i and to_f always succeed on a string, returning the numeric value of the digits at the start of the string, or zero if there are no initial digits.

arithmetic operators
The operators for addition, subtraction, multiplication, float division, integer division, modulus, and exponentiation.

integer division
How to get the integer quotient of two integers. How to get the integer quotient and remainder. perl:

The integer pragma makes all arithmetic operations integer operations. Floating point numbers are truncated before they are used. Hence integer division could be performed with:
use integer; my $a = 7 / 3; no integer;

float division
How to perform floating point division, even if the operands might be integers.

arithmetic functions
Some arithmetic functions. Trigonometric functions are in radians unless otherwise noted. Logarithms are natural unless otherwise noted. python: Python also has math.log10. To compute the log of x for base b, use:
math.log(x)/math.log(b)

ruby: Ruby also has Math.log2, Math.log10. To compute the log of x for base b, use
Math.log(x)/Math.log(b)

arithmetic truncation
How to truncate a float to the nearest integer towards zero; how to round a float to the nearest integer; how to find the nearest integer above a float; how to find the nearest integer below a float; how to take the absolute value. perl: The CPAN module Number::Format provides a round function. The 2nd argument specifies the number of digits to keep to the right of the radix. The default is 2.
use Number::Format 'round'; round(3.14, 0);

min and max


How to get the min and max.

division by zero
What happens when division by zero is performed.

integer overflow
What happens when the largest representable integer is exceeded.

float overflow
What happens when the largest representable float is exceeded.

sqrt -2
The result of taking the square root of negative two.

rational numbers
How to create rational numbers and get the numerator and denominator. ruby: Require the library mathn and integer division will yield rationals instead of truncated integers.

complex numbers
python: Most of the functions in math have analogues in cmath which will work correctly on complex numbers.

random integer, uniform float, normal float


How to generate a random integer between 0 and 99, include, float between zero and one in a uniform distribution, or a float in a normal distribution with mean zero and standard deviation one.

set random seed, get and restore seed


How to set the random seed; how to get the current random seed and later restore it. All the languages in the sheet set the seed automatically to a value that is difficult to predict. The Ruby 1.9 MRI interpreter uses the current time and process ID, for example. As a result there is usually no need to set the seed. Setting the seed to a hardcoded value yields a random but repeatable sequence of numbers. This can be used to ensure that unit tests which cover code using random numbers doesn't intermittently fail. The seed is global state. If multiple functions are generating random numbers then saving and restoring the seed may be necessary to produce a repeatable sequence.

bit operators
The bit operators for left shift, right shift, and, inclusive or, exclusive or, and negation.

binary, octal, and hex literals


Binary, octal, and hex integer literals

base conversion
How to convert integers to strings of digits of a given base. How to convert such strings into integers. perl Perl has the functions oct and hex which convert strings encoded in octal and hex and return the corresponding integer. The oct function will handle binary or hex encoded strings if they have "0b" or "0x" prefixes.
oct("60") oct("060") oct("0b101010") oct("0x2a") hex("2a") hex("0x2a")

python Python has the functions bin, oct, and hex which take an integer and return a string encoding the integer in base 2, 8, and 16.
bin(42) oct(42) hex(42)

String Footnotes
string literal
The syntax for string literals. perl: When use strict is not in effect bareword strings are permitted. Barewords are strings without quote delimiters. They are a feature of shells. Barewords cannot contain whitespace or any other character used by the tokenizer to distinguish words. Before Perl 5 subroutines were invoked with an ampersand prefix & or the older do keyword. With Perl 5 neither is required, but this made it impossible to distinguish a bareword string from a subroutine without knowing all the subroutines which are in scope. The following code illustrates the bareword ambiguity:
no strict; print rich . "\n"; # prints "rich"; rich is a bareword string

sub rich { return "poor" } print rich . "\n"; # prints "poor"; rich is now a subroutine

newline in literal
Whether newlines are permitted in string literals. python: Newlines are not permitted in single quote and double quote string literals. A string can continue onto the following line if the last character on the line is a backslash. In this case, neither the backslash nor the newline are taken to be part of the string. Triple quote literals, which are string literals terminated by three single quotes or three double quotes, can contain newlines:
'''This is two lines''' """This is also two lines"""

backslash escapes
Backslash escape sequences for inserting special characters into string literals. python: When string literals have an r or R prefix there are no backslash escape sequences and any backslashes thus appear in the created string. The delimiter can be inserted into a string if it is preceded by a backslash, but the backslash is also inserted. It is thus not possible to create a string with an r or R prefix that ends in a backslash. The r and R prefixes can be used with single or double quotes:
r'C:\Documents and Settings\Admin' r"C:\Windows\System32"

The \uhhhh escapes are also available inside Python 2 Unicode literals. Unicode literals have a u prefiix:
u'lambda: \u03bb'

variable interpolation
How to interpolate variables into strings. python:
str.format

will take named or positional parameters. When used with named parameters str.format can mimic the variable interpolation feature of the other languages.

A selection of variables in scope can be passed explicitly:


count = 3

item = 'ball' print('{count} {item}s'.format( count=count, item=item))

Python 3 has format_map which accepts a dict as an argument:


count = 3 item = 'ball' print('{count} {item}s'.format_map(locals()))

custom delimiters
How to specify custom delimiters for single and double quoted strings. These can be used to avoid backslash escaping. If the left delimiter is (, [, or { the right delimiter must be ), ], or }, respectively.

sprintf
How to create a string using a printf style format. python: The % operator will interpolate arguments into printf-style format strings. The str.format with positional parameters provides an alternative format using curly braces {0}, {1}, for replacement fields. The curly braces are escaped by doubling:
'to insert parameter {0} into a format, use {{{0}}}'.format(3)

If the replacement fields appear in sequential order and aren't repeated, the numbers can be omitted:
'lorem {} {} {}'.format('ipsum', 13, 3.7)

here document
Here documents are strings terminated by a custom identifier. They perform variable substitution and honor the same backslash escapes as double quoted strings. perl: Put the custom identifer in single quotes to prevent variable interpolation and backslash escape interpretation:
s = <<'EOF'; Perl code uses variables with dollar signs, e.g. $var EOF

python: Python lacks variable interpolation in strings. Triple quotes honor the same backslash escape sequences as regular quotes, so triple quotes can otherwise be used like here documents:

s = '''here document there computer '''

ruby: Put the customer identifier in single quotes to prevent variable interpolation and backslash escape interpretation:
s = <<'EOF' Ruby code uses #{var} type syntax to interpolate variables into strings. EOF

concatenate
The string concatenation operator.

replicate
The string replication operator.

split, in two, with delimiters, into characters


How to split a string containing a separator into an array of substrings; how to split a string in two; how to split a string with the delimiters preserved as separate elements; how to split a string into an array of single character strings. python:
str.split()

takes simple strings as delimiters; use re.split() to split on a regular expression:

re.split('\s+', 'do re mi fa') re.split('\s+', 'do re mi fa', 1)

join
How to concatenate the elements of an array into a string with a separator.

case manipulation
How to put a string into all caps or all lower case letters. How to capitalize the first letter of a string.

strip
How to remove whitespace from the ends of a string.

pad on right, on left

How to pad the edge of a string with spaces so that it is a prescribed length.

length
How to get the length in characters of a string.

index of substring
How to find the index of the leftmost occurrence of a substring in a string; how to find the index of the rightmost occurrence. python: Methods for splitting a string into three parts using the first or last occurrence of a substring:
'do re re mi'.partition('re') 'do re re mi'.rpartition('re') # returns ('do ', 're', ' re mi') # returns ('do re ', 're', ' mi')

extract substring
How to extract a substring from a string by index.

extract character
How to extract a character from a string by its index.

chr and ord


Converting characters to ASCII codes and back. The languages in this reference sheet do not have character literals, so characters are represented by strings of length one.

character translation
How to apply a character mapping to a string.

Regular Expressions

PHP PCRE Regexes perlre and perlreref Python re library: 2.7, 3.1 Ruby Regexp

Regular expressions or regexes are a way of specifying sets of strings. If a string belongs to the set, the string and regex "match". Regexes can also be used to parse strings.

The modern notation for regexes was introduced by Unix command line tools in the 1970s. POSIX standardized the notation into two types: extended regexes and the more archaic basic regexes. Perl regexes are extended regexes augmented by new character class abbreviations and a few other features introduced by the Perl interpreter in the 1990s. All the languages in this sheet use Perl regexes. Any string that doesn't contain regex metacharacters is a regex which matches itself. The regex metacharacters are: [ ] . | ( ) * + ? { } ^ $ \ character classes: [ ] . A character class is a set of characters in brackets: [ ]. When used in a regex it matches any character it contains. Character classes have their own set of metacharacters: ^ - \ ] The ^ is only special when it the first character in the character class. Such a character class matches its complement; that is, any character not inside the brackets. When not the first character the ^ refers to itself. The hypen is used to specify character ranges: e.g. 0-9 or A-Z. When the hyphen is first or last inside the brackets it matches itself. The backslash can be used to escape the above characters or the terminal character class delimiter: ]. It can be used in character class abbreviations or string backslash escapes. The period . is a character class abbreviation which matches any character except for newline. In all languages the period can be made to match all characters. In PHP and Perl use the m modifer. In Python use the re.M flag. In Ruby use the s modifer.

character class abbreviations: abbrev name character class \d digit [0-9] \D nondigit [^0-9] PHP, Perl: horizontal whitespace character PHP, Perl: [ \t] \h Ruby: hex digit Ruby: [0-9a-fA-F] PHP, Perl: not a horizontal whitespace character PHP, Perl: [^ \t] \H Ruby: not a hex digit Ruby: [^0-9a-fA-F] \s whitespace character [ \t\r\n\f] \S non whitespace character [^ \t\r\n\f] \v vertical whitespace character [\r\n\f] \V not a vertical whitespace character [^\r\n\f] \w word character [A-Za-z0-9_] \W non word character [^A-Za-z0-9_] alternation and grouping: | ( ) The vertical pipe | is used for alternation and parens () for grouping. A vertical pipe takes as its arguments everything up to the next vertical pipe, enclosing paren, or end of string. Parentheses control the scope of alternation and the quantifiers described below. The are also used for capturing groups, which are the substrings which matched parenthesized parts of the regular expression. Each language numbers the groups and provides a mechanism for extracting when a match is made. A parenthesized subexpression can be removed from the groups with this syntax: (?:expr)

quantifiers: * + ? { } As an argument quantifiers take the preceding regular character, character class, or group. The argument can itself be quantified, so that ^a{4}*$ matches strings with the letter a in multiples of 4. quantifier # of occurrences of argument matched * zero or more, greedy + one or more, greedy ? zero or one, greedy {m,n} m to n, greedy {n} exactly n {m,} m or more, greedy {,n} zero to n, greedy *? zero or more, lazy +? one or more, lazy {m,n}? m to n, lazy {m,}? m or more, lazy {,n}? zero to n, lazy When there is a choice, greedy quantifiers will match the maximum possible number of occurrences of the argument. Lazy quantifiers match the minimum possible number.

anchors: ^ $ anchor matches ^ beginning of a string. In Ruby or when m modifier is used also matches right side of a newline $ end of a string. In Ruby or when m modifier is used also matches left side of a newline \A beginning of the string \b word boundary. In between a \w and a \W character or in between a \w character and the edge of the string \B not a word boundary. In between two \w characters or two \W characters \z end of the string \Z end of the string unless it is a newline, in which case it matches the left side of the terminal newline escaping: \ To match a metacharacter, put a backslash in front of it. To match a backslash use two backslashes. php: PHP 5.3 still supports the EREG engine, though the functions which use it are deprecated. These include the split function and functions which start with ereg. The preferred functions are preg_split and the other functions with a preg prefix.

literal, custom delimited literal

The literal for a regular expression; the literal for a regular expression with a custom delimiter. php: PHP regex literals are strings. The first character is the delimiter and it must also be the last character. If the start delimiter is (, {, or [ the end delimiter must be ), }, or ], respectively. Here are the signatures from the PHP manual for the preg functions used in this sheet:
array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] ) int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] ) mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )

python: Python does not have a regex literal, but the re.compile function can be used to create regex objects. Compiling regexes can always be avoided:
re.compile('\d{4}').search('1999') re.search('\d{4}', '1999') re.compile('foo').sub('bar', 'foo bar') re.sub('foo', 'bar', 'foo bar') re.compile('\w+').findall('do re me') re.findall('\w+', 'do re me')

character class abbreviations and anchors


The supported character class abbreviations and anchors. Note that \h refers to horizontal whitespace (i.e. a space or tab) in PHP and Perl and a hex digit in Ruby. Similarly \H refers to something that isn't horizontal whitespace in PHP and Perl and isn't a hex digit in Ruby.

match test
How to test whether a string matches a regular expression. python: The re.match function is like the re.search function, except that it is only true if the regular expression matches the entire string. ruby:
match

is a method of both Regexp and String so can match with both

/1999/.match("1999")

and
"1999".match(/1999/)

When variables are involved it is safer to invoke the Regexp method because string variables are more likely to contain nil.

case insensitive match test


How to perform a case insensitive match test.

modifiers
Modifiers that can be used to adjust the behavior of a regular expression. The lists are not comprehensive. For all languages except Ruby there are additional modifiers. modifier behavior e PHP: when used with preg_replace, the replacement string, after backreferences are substituted, is eval'ed as PHP code and the result is used as the replacement. i, re.I all: ignores case. Upper case letters match lower case letters and vice versa. PHP, Perl, Python: makes the ^ and $ match the right and left edge of newlines in addition to the beginning and end of the string. m, re.M Ruby: makes the period . match newline characters. o Ruby: performs variable interpolation #{ } only once per execution of the program. p Perl: sets ${^MATCH} ${^PREMATCH} and ${^POSTMATCH} s, re.S PHP, Perl, Python: makes the period . match newline characters. x, re.X all: ignores whitespace in the regex which permits it to be used for formatting. Python modifiers are bit flags. To use more than one flag at the same time, join them with bit or: |

substitution
How to replace all occurrences of a matching pattern in a string with the provided substitution string. php: The number of occurrences replaced can be controlled with a 4th argument to preg_replace:
$s = "foo bar bar"; preg_replace('/bar/', "baz", $s, 1);

If no 4th argument is provided, all occurrences are replaced. perl: The =~ operator performs the substitution in place on the string and returns the number of substitutions performed.

The g modifiers specifies that all occurrences should be replaced. If omitted, only the first occurrence is replaced. python: The 3rd argument to sub controls the number of occurrences which are replaced.
s = 'foo bar bar' re.compile('bar').sub('baz', s, 1)

If there is no 3rd argument, all occurrences are replaced. ruby: The gsub operator returns a copy of the string with the substitution made, if any. The gsub! performs the substitution on the original string and returns the modified string. The sub and sub! operators only replace the first occurrence of the match pattern.

match, prematch, postmatch


How to get the substring that matched the regular expression, as well as the part of the string before and after the matching substring. perl: The special variables $&, $`, and $' also contain the match, prematch, and postmatch. ruby: The special variables $&, $`, and $' also contain the match, prematch, and postmatch.

group capture
How to get the substrings which matched the parenthesized parts of a regular expression. ruby: Ruby has syntax for extracting a group from a match in a single expression. The following evaluates to "1999":
"1999-07-08"[/(\d{4})-(\d{2})-(\d{2})/, 1]

scan
How to return all non-overlapping substrings which match a regular expression as an array.

backreference in match and substitution


How to use backreferences in a regex; how to use backreferences in the replacement string of substitution.

recursive regex
Examples of recursive regexes. The examples match substrings containing balanced parens.

Date and Time Footnotes


In ISO 8601 terminology, a date specifies a day in the Gregorian calendar and a time does not contain date information; it merely specifies a time of day. A data type which combines both date and time information is probably more useful than one which contains just date information or just time information; it is unfortunate that ISO 8601 doesn't provide a name for this entity. The word timestamp often gets used to denote a combined date and time. PHP and Python use the compound noun datetime for combined date and time values. An useful property of ISO 8601 dates, times, and date/time combinations is that they are correctly ordered by a lexical sort on their string representations. This is because they are big-endian (the year is the leftmost element) and they used fixed-length fields for each term in the string representation. The C standard library provides two methods for representing dates. The first is the UNIX epoch, which is the seconds since January 1, 1970 in UTC. If such a time were stored in a 32-bit signed integer, the rollover would happen on January 18, 2038. The other method of representing dates is the tm struct, a definition of which can be found on Unix systems in /usr/include/time.h:
struct tm { int int int int int int int int int long char }; tm_sec; tm_min; tm_hour; tm_mday; tm_mon; tm_year; tm_wday; tm_yday; tm_isdst; tm_gmtoff; *tm_zone; /* /* /* /* /* /* /* /* /* /* /* seconds after the minute [0-60] */ minutes after the hour [0-59] */ hours since midnight [0-23] */ day of the month [1-31] */ months since January [0-11] */ years since 1900 */ days since Sunday [0-6] */ days since January 1 [0-365] */ Daylight Savings Time flag */ offset from CUT in seconds */ timezone abbreviation */

Perl and Python both use and expose the tm struct of the standard library. In the case of Perl, the first nine values of the struct (up to the member tm_isdst) are put into an array. Python, meanwhile, has a module called time which is a thin wrapper to the standard library functions which operate on this struct. Here is how get a tm struct in Python:
import time utc = time.gmtime(time.time()) t = time.localtime(time.time())

The tm struct is a low level entity, and interacting with it directly should be avoided. In the case of Python it is usually sufficient to use the datetime module instead. For Perl, one can use the Time::Piece module to wrap the tm struct in an object.

date/time type
The data type used to hold a combined date and time.

perl Built in Perl functions work with either (1) scalars containing the Unix epoch as an integer or (2) arrays containing the first nine values of the standard C library tm struct. When use Time::Piece is in effect functions which work with tm arrays are replaced with variant that work with the Time::Piece wrapper. The modules Time::Local and Date::Parse can create scalars containing the Unix epoch. CPAN provides the DateTime module which provides objects with functionality comparable to the DateTime objects of PHP and Python.

current date/time
How to get the combined date and time for the present moment in both local time and UTC.

to unix epoch, from unix epoch


How to convert the native date/time type to the Unix epoch which is the number of seconds since the start of January 1, 1970 UTC.

current unix epoch


How to get the current time as a Unix epoch timestamp.

strftime
How to format a date/time as a string using the format notation of the strftime function from the standard C library. This same format notation is used by the Unix date command. php: PHP supports strftime but it also has its own time formatting system used by date, DateTime::format, and DateTime::createFromFormat. The letters used in the PHP time formatting system are described here.

default format example


Examples of how a date/time object appears when treated as a string such as when it is printed to standard out. The formats are in all likelihood locale dependent. The provided examples come from a machine running Mac OS X in the Pacific time zone of the USA. php: It is a fatal error to treat a DateTime object as a string.

strptime
How to parse a date/time using the format notation of the strptime function from the standard C library.

parse date w/o format

How to parse a date without providing a format string.

result date subtraction


The data type that results when subtraction is performed on two combined date and time values.

add time duration


How to add a time duration to a date/time. A time duration can easily be added to a date/time value when the value is a Unix epoch value. ISO 8601 distinguishes between a time interval, which is defined by two date/time endpoints, and a duration, which is the length of a time interval and can be defined by a unit of time such as '10 minutes'. A time interval can also be defined by date and time representing the start of the interval and a duration. ISO 8601 defines notation for durations. This notation starts with a 'P' and uses a 'T' to separate the day and larger units from the hour and smaller units. Observing the location relative to the 'T' is important for interpreting the letter 'M', which is used for both months and minutes.

local timezone
Do date/time values include timezone information. When a date/time value for the local time is created, how the local timezone is determined. A date/time value can represent a local time but not have any timezone information associated with it. On Unix systems processes determine the local timezone by inspecting the file /etc/localtime. php: The default timezone can also be set in the php.ini file.
date.timezone = "America/Los_Angeles"

Here is the list of timezones supported by PHP.

timezone name, offset from UTC, is daylight savings?


How to get time zone information: the name of the timezone, the offset in hours from UTC, and whether the timezone is currently in daylight savings. Timezones are often identified by three or four letter abbreviations. As can be seen from the list, many of the abbreviations do not uniquely identify a timezone. Furthermore many of the timezones have been altered in the past. The Olson database (aka Tz database) decomposes the world into zones in which the local clocks have all been set to the same time since 1970 and it gives these zones unique names. perl: It is not necessary to create a DateTime object to get the local timezone offset:
use Time::Piece;

$t = localtime(time); $offset_hrs = $t->tzoffset / 3600;

ruby: The Time class has a zone method which returns the time zone abbreviation for the object. There is a tzinfo gem which can be used to create timezone objects using the Olson database name. This can in turn be used to convert between UTC times and local times which are daylight saving aware.

microseconds
How to get the microseconds component of a combined date and time value. The SI abbreviations for milliseconds and microseconds are ms and s, respectively. The C standard library uses the letter u as an abbreviation for micro. Here is a struct defined in /usr/include/sys/time.h:
struct timeval { time_t tv_sec; suseconds_t tv_usec; }; /* seconds since Jan. 1, 1970 */ /* and microseconds */

sleep
How to put the process to sleep for a specified number of seconds. In Python and Ruby the default version of sleep supports a fractional number of seconds. php: PHP provides usleep which takes an argument in microseconds:
usleep(500000);

perl: The Perl standard library includes a version of sleep which supports fractional seconds:
use Time::HiRes qw(sleep); sleep 0.5;

timeout
How to cause a process to timeout if it takes too long. Techniques relying on SIGALRM only work on Unix systems.

Array Footnotes
What the languages call their basic container types:

php perl python ruby array array array, list list, tuple, sequence Array, Enumerable dictionary array hash dict, mapping Hash php: PHP uses the same data structure for arrays and dictionaries. perl: array refers to a data type. list refers to a context. python: Python has the mutable list and the immutable tuple. Both are sequences. To be a sequence, a class must implement __getitem__, __setitem__, __delitem__, __len__, __contains__, __iter__, __add__, __mul__, __radd__, and __rmul__. ruby: Ruby provides an Array datatype. If a class defines an each iterator and a comparison operator <=>, then it can mix in the Enumerable module.

literal
Array literal syntax. perl: Square brackets create an array and return a reference to it:
$a = [1,2,3]

quote words
The quote words operator, which is a literal for arrays of strings where each string contains a single word.

size
How to get the number of elements in an array.

empty test
How to test whether an array is empty.

lookup

How to access a value in an array by index. perl: A negative index refers to the length - index element. python: A negative index refers to the length - index element.
>>> a = [1,2,3] >>> a[-1] 3

ruby: A negative index refers to to the length - index element.

update
How to update the value at an index.

out-of-bounds behavior
What happens when the value at an out-of-bounds index is refererenced.

index of array element


perl: Some techniques for getting the index of an array element.

slice by endpoints, by length


How to slice a subarray from an array by specifying a start index and an end index; how to slice a subarray from an array by specifying an offset index and a length index. perl: Perl arrays can take an array of indices as the index value. The range of values selected can be discontinuous and the order of the values can be manipulated:
@nums = (1,2,3,4,5,6); @nums[(1,3,2,4)];

python: Slices can leave the first or last index unspecified, in which case the first or last index of the sequence is used:

>>> a=[1,2,3,4,5] >>> a[:3] [1, 2, 3]

Python has notation for taking every nth element:


>>> a=[1,2,3,4,5] >>> a[::2] [1, 3, 5]

The third argument in the colon-delimited slice argument can be negative, which reverses the order of the result:
>>> a = [1,2,3,4] >>> a[::-1] [4, 3, 2, 1]

slice to end
How to slice to the end of an array. The examples take all but the first element of the array.

manipulate back
How to add and remove elements from the back or high index end of an array. These operations can be used to use the array as a stack.

manipulate front
How to add and remove elements from the front or low index end of an array. These operations can be used to use the array as a stack. They can be used with the operations that manipulate the back of the array to use the array as a queue.

concatenate
How to create an array by concatenating two arrays; how to modify an array by concatenating another array to the end of it.

replicate
How to create an array containing the same value replicated n times.

address copy, shallow copy, deep copy


How to make an address copy, a shallow copy, and a deep copy of an array. After an address copy is made, modifications to the copy also modify the original array.

After a shallow copy is made, the addition, removal, or replacement of elements in the copy does not modify of the original array. However, if elements in the copy are modified, those elements are also modified in the original array. A deep copy is a recursive copy. The original array is copied and a deep copy is performed on all elements of the array. No change to the contents of the copy will modify the contents of the original array. perl: Taking a reference is customary way to make an address copy in Perl, but the Perl example is not equivalent to the other languages in that different syntax has to be used to access the original array and the address copy: @a and @$a1. To make @a1 and @a refer to the same array, use typeglobs:
*a1 = *a;

python: The slice operator can be used to make a shallow copy:


a2 = a[:] list(v)

always returns a list, but v[:] returns a value of the same as v. The slice operator can be used in this manner on strings and tuples but there is little incentive to do so since both are immutable. can be used to make a shallow copy on types that don't support the slice operator such as a dictionary. Like the slice operator copy.copy returns a value with the same type as the argument.

copy.copy

arrays as function arguments


How arrays are passed as arguments.

iteration
How to iterate through the elements of an array. perl:
for

and foreach are synonyms. Some use for exclusively for C-style for loops and foreach for array iteration.

indexed iteration
How to iterate through the elements of an array while keeping track of the index of each element.

iterate over range


Iterate over a range without instantiating it as a list. perl: With Perl 5.005 the for and foreach operators were optimized to not instantiate a range argument as a list.

instantiate range as array


How to convert a range to an array. Python 3 ranges and Ruby ranges implement some of the functionality of arrays without allocating space to hold all the elements. python: In Python 2 range() returns a list. In Python 3 range() returns an object which implements the immutable sequence API. ruby: The Range class includes the Enumerable module.

reverse
How to create a reversed copy of an array, and how to reverse an array in place. python:
reversed

returns an iterator which can be used in a for/in construct:

print("counting down:") for i in reversed([1,2,3]): print(i) reversed

can be used to create a reversed list:

a = list(reversed([1,2,3]))

sort
How to create a sorted copy of an array, and how to sort an array in place. Also, how to set the comparison function when sorting. php:
usort

sorts an array in place and accepts a comparison function as a 2nd argument:

function cmp($x, $y) { $lx = strtolower($x); $ly = strtolower($y); if ( $lx < $ly ) { return -1; } if ( $lx == $ly ) { return 0; } return 1; } $a = array("b", "A", "a", "B");

usort($a, "cmp");

dedupe
How to remove extra occurrences of elements from an array. python: Python sets support the len, in, and for operators. It may be more efficient to work with the result of the set constructor directly rather than convert it back to a list.

membership
How to test for membership in an array.

intersection
How to compute an intersection. python: Python has literal notation for sets:
{1,2,3}

Use set and list to convert lists to sets and vice versa:
a = list({1,2,3}) ensemble = set([1,2,3])

ruby: The intersect operator & always produces an array with no duplicates.

union
ruby: The union operator | always produces an array with no duplicates.

relative complement, symmetric difference


How to compute the relative complement of two arrays or sets; how to compute the symmetric difference. ruby:

If an element is in the right argument, then it will not be in the return value even if it is contained in the left argument multiple times.

map
Create an array by applying a function to each element of a source array. ruby: The map! method applies the function to the elements of the array in place.
collect

and collect! are synonyms for map and map!.

filter
Create an array containing the elements of a source array which match a predicate. ruby: The in place version is select!.
reject

returns the complement of select. reject! is the in place version.

reduce
Return the result of applying a binary operator to all the elements of the array. python:
reduce

is not needed to sum a list of numbers:

sum([1,2,3])

ruby: The code for the reduction step can be provided by name. The name can be a symbol or a string:
[1,2,3].inject(:+) [1,2,3].inject("+") [1,2,3].inject(0, :+) [1,2,3].inject(0, "+")

universal and existential tests


How to test whether a condition holds for all members of an array; how to test whether a condition holds for at least one member of any array.

A universal test is always true for an empty array. An existential test is always false for an empty array. A existential test can readily be implemented with a filter. A universal test can also be implemented with a filter, but it is more work: one must set the condition of the filter to the negation of the predicate and test whether the result is empty.

shuffle and sample


How to shuffle an array. How to extract a random sample from an array. php: The array_rand function returns a random sample of the indices of an array. The result can easily be converted to a random sample of array values:
$a = array(1, 2, 3, 4); $sample = array(); foreach (array_rand($a, 2) as $i) { array_push($sample, $a[$i]); }

zip
How to interleave arrays. In the case of two arrays the result is an array of pairs or an associative list. perl:
zip

expects arrays as arguments, which makes it difficult to define the arrays to be zipped on the same line as the invocation. It can be done like this:

@a = zip @{[1,2,3]}, @{['a','b','c']};

Dictionary Footnotes
literal
perl: Curly brackets create a hash and return a reference to it:
$h = { 'hello' => 5, 'goodbye' => 7 }

size
How to get the number of dictionary keys in a dictionary.

lookup
How to lookup a dictionary value using a dictionary key.

perl: Use the ampersand prefix @ to slice a Perl hash. The index is a list of keys.
%nums = ('b'=>1, 't'=>2, 'a'=>3); @nums{('b','t')}

out-of-bounds behavior
What happens when a lookup is performed on a key that is not in a dictionary. python: Use dict.get() to avoid handling KeyError exceptions:
d = {} d.get('lorem') d.get('lorem', '') # returns None # returns ''

is key present
How to check for the presence of a key in a dictionary without raising an exception. Distinguishes from the case where the key is present but mapped to null or a value which evaluates to false.

delete entry
How to remove a key/value pair from a dictionary.

from array of pairs, from even length array


How to create a dictionary from an array of pairs; how to create a dictionary from an even length array.

merge
How to merge the values of two dictionaries. In the examples, if the dictionaries d1 and d2 share keys then the values from d2 will be used in the merged dictionary.

invert
How to turn a dictionary into its inverse. If a key 'foo' is mapped to value 'bar' by a dictionary, then its inverse will map the key 'bar' to the value 'foo'. However, if multiple keys are mapped to the same value in the original dictionary, then some of the keys will be discarded in the inverse.

iteration
How to iterate through the key/value pairs in a dictionary.

python: In Python 2.7 dict.items() returns a list of pairs and dict.iteritems() returns an iterator on the list of pairs. In Python 3 dict.items() returns an iterator and dict.iteritems() has been removed.

keys and values as arrays


How to convert the keys of a dictionary to an array; how to convert the values of a dictionary to an array. python: In Python 3 dict.keys() and dict.values() return read-only views into the dict. The following code illustrates the change in behavior:
d = {} keys = d.keys() d['foo'] = 'bar' if 'foo' in keys: print('running Python 3') else: print('running Python 2')

default value, computed value


How to create a dictionary with a default value for missing keys; how to compute and store the value on lookup. php: Extend ArrayObject to compute values on lookup:
class Factorial extends ArrayObject { public function offsetExists($i) { return true; } public function offsetGet($i) { if(!parent::offsetExists($i)) { if ( $i < 2 ) { parent::offsetSet($i, 1); } else { $n = $this->offsetGet($i-1); parent::offsetSet($i, $i*$n); } } return parent::offsetGet($i); } } $factorial = new Factorial();

perl: How to use a tied hash. If the CPAN module Tie::ExtraHash is installed there is a shorter way.

Function Footnotes
Python has both functions and methods. Ruby only has methods: functions defined at the top level are in fact methods on a special main object. Perl subroutines can be invoked with a function syntax or a method syntax.

function declaration
How to define a function. perl: One can also use shift to put the arguments into local variables:
sub add { my $a = shift; my $b = shift; $a + $b; }

function invocation
How to invoke a function. python: When invoking methods and functions, parens are mandatory, even for functions which take no arguments. Omitting the parens returns the function or method as an object. Whitespace can occur between the function name and the following left paren. Starting with 3.0, print is treated as a function instead of a keyword. Thus parens are mandatory around the print argument. ruby: Ruby parens are optional. Leaving out the parens results in ambiguity when function invocations are nested. The interpreter resolves the ambiguity by assigning as many arguments as possible to the innermost function invocation, regardless of its actual arity. As of Ruby 1.9, it is mandatory that the left paren not be separated from the method name by whitespace.

missing argument behavior


How incorrect number of arguments upon invocation are handled. perl:

Perl collects all arguments into the @_ array, and subroutines normally don't declare the number of arguments they expect. However, this can be done with prototypes. Prototypes also provide a method for taking an array from the caller and giving a reference to the array to the callee. python: TypeError is raised if the number of arguments is incorrect. ruby: ArgumentError is raised if the number of arguments is incorrect.

default value
How to declare a default value for an argument.

variable number of arguments


How to write a function which accepts a variable number of argument. python: This function accepts one or more arguments. Invoking it without any arguments raises a TypeError:
def poker(dealer, *players): ...

ruby: This function accepts one or more arguments. Invoking it without any arguments raises an ArgumentError:
def poker(dealer, *players) ... end

named parameters
How to write a function which uses named parameters and how to invoke it. python: In a function definition, the splat operator * collects the remaining arguments into a list. In a function invocation, the splat can be used to expand an array into separate arguments. In a function definition the double splat operator ** collects named parameters into a dictionary. In a function invocation, the double splat expands a dictionary into named parameters. In Python 3 named parameters can be made mandatory:
def fequal(x, y, *, eps): return abs(x-y) < eps

fequal(1.0, 1.001, eps=0.01) fequal(1.0, 1.001)

# True # raises TypeError

pass number or string by reference


How to pass numbers or strings by reference. The three common methods of parameter passing are pass by value, pass by reference, and pass by address. Pass by value is the default in most languages. When a parameter is passed by reference, the callee can changed the value in the variable that was provided as a parameter, and the caller will see the new value when the callee returns. When the parameter is passed by value the callee cannot do this. When a language has mutable data types it can be unclear whether the language is using pass by value or pass by reference. perl: Here is a potential for confusion: if a reference is used in Perl to pass data, that is pass by address, not pass by reference. A Perl reference is comparable to a pointer in C, albeit one that knows the data type of what it points to at runtime. C++ has both pointers and references and thus can pass data by address or by reference, though pass by value is the default.

pass array or dictionary by reference


How to pass an array or dictionary without making a copy of it. perl: Arrays and hashes are not passed by reference by default. If an array is provided as a argument, each element of the array will be assigned to a parameter. A change to the parameter will change the corresponding value in the original array, but the number of elements in the array cannot be increased. To write a function which changes the size of the array the array must be passed by reference using the backslash notation. When a hash is provided as a argument each key of the has will be assigned to a parameter and each value of the hash will be assigned to a parameter. In other words the number of parameters seen by the body of the function will be twice the size of the hash. Each value parameter will immediately follow its key parameter.

return value
How the return value of a function is determined.

multiple return values


How to return multiple values from a function.

lambda declaration and invocation


How to define and invoke a lambda function. python:

Python lambdas cannot contain newlines or semicolons, and thus are limited to a single statement or expression. Unlike named functions, the value of the last statement or expression is returned, and a return is not necessary or permitted. Lambdas are closures and can refer to local variables in scope, even if they are returned from that scope. If a closure function is needed that contains more than one statement, use a nested function:
def make_nest(x): b = 37 def nest(y): c = x*y c *= b return c return nest n = make_nest(12*2) print(n(23))

Python closures are read only. A nested function can be returned and hence be invoked outside of its containing function, but it is not visible by its name outside of its containing function. ruby: The following lambda and Proc object behave identically:
sqr = lambda { |x| x * x } sqr = Proc.new {|x| x * x }

With respect to control words, Proc objects behave like blocks and lambdas like functions. In particular, when the body of a Proc object contains a return or break statement, it acts like a return or break in the code which invoked the Proc object. A return in a lambda merely causes the lambda to exit, and a break inside a lambda must be inside an appropriate control structure contained with the lambda body. Ruby 1.9 introduces new syntax for defining lambdas and invoking them:
sqr = ->(x) {x*x} sqr.(2)

function reference
How to store a function in a variable. php: If a variable containing a string is used like a function then PHP will look for a function with the name in the string and attempt to invoke it. python: Python function are stored in variables by default. As a result a function and a variable with the same name cannot share the same scope. This is also the reason parens are mandatory when invoking Python functions.

function with private state

How to create a function with private state which persists between function invocations. python: Here is a technique for creating private state which exploits the fact that the expression for a default value is evaluated only once:
def counter(_state=[0]): _state[0] += 1 return _state[0] print(counter())

closure
How to create a first class function with access to the local variables of the local scope in which it was created. python: Python 2 has limited closures: access to local variables in the containing scope is read only and the bodies of anonymous functions must consist of a single expression. Python 3 permits write access to local variables outside the immediate scope when declared with nonlocal.

generator
How to create a function which can yield a value back to its caller and suspend execution. perl: CPAN provides a module called Coro which implements coroutines. Some notes on the distinction between coroutines and generators. python: Python generators can be used in for/in statements and list comprehensions. ruby: Ruby generators are called fibers.

Execution Control Footnotes


if
The if statement. php:

PHP has the following alternate syntax for if statements:


if ($n echo elseif echo else: echo endif; == 0): "no hits\n"; ($n == 1): "one hit\n"; "$n hits\n";

perl: When an if block is the last statement executed in a subroutine, the return value is the value of the branch that executed. ruby: If an if statement is the last statement executed in a function, the return value is the value of the branch that executed. Ruby if statements are expressions. They can be used on the right hand side of assignments:
m = if n 1 else 0 end

switch
The switch statement.

while
php: PHP provides a do-while loop. The body of such a loop is guaranteed to execute at least once.
$i = 0; do { echo $i; } while ($i > 0);

perl: Perl provides until, do-while, and do-until loops. An until or a do-until loop can be replaced by a while or a do-while loop by negating the condition. ruby: Ruby provides a loop with no exit condition:

def yes(expletive="y") loop do puts expletive end end

Ruby also provides the until loop. Ruby loops can be used in expression contexts but they always evaluate to nil.

c-style for
How to write a C-style for loop.

break, continue, redo


break exits a for or while loop immediately. continue goes to the next iteration of the loop. redo goes back to the beginning of the current iteration.

control structure keywords


A list of control structure keywords. The loop control keywords from the previous line are excluded. The list summarizes the available control structures. It excludes the keywords for exception handling, loading libraries, and returning from functions.

what do does
How the do keyword is used. perl: The do keyword can convert an if statement to a conditional expression:
my $m = do { if ($n) { 1 } else { 0 } };

statement modifiers
Clauses added to the end of a statement to control execution. Perl and Ruby have conditional statement modifers. Ruby also has looping statement modifers. ruby: Ruby has the looping statement modifiers while and until:

i = 0 i += 1 while i < 10 j = 10 j -= 1 until j < 0

raise exception
How to raise exceptions. ruby: Ruby has a throw keyword in addition to raise. throw can have a symbol as an argument, and will not convert a string to a RuntimeError exception.

catch exception
How to catch exceptions. php: PHP code must specify a variable name for the caught exception. Exception is the top of the exception hierarchy and will catch all exceptions. Internal PHP functions usually do not throw exceptions. They can be converted to exceptions with this signal handler:
function exception_error_handler($errno, $errstr, $errfile, $errline ) { throw new ErrorException($errstr, 0, $errno, $errfile, $errline); } set_error_handler("exception_error_handler");

ruby: A rescue Exception clause will catch any exception. A rescue clause with no exception type specified will catch exceptions that are subclasses of StandardError. Exceptions outside StandardError are usually unrecoverable and hence not handled in code. In a rescue clause, the retry keyword will cause the begin clause to be re-executed. In addition to begin and rescue, ruby has catch:
catch (:done) do loop do retval = work throw :done if retval < 10 end end

global variable for last exception


The global variable name for the last exception raised.

define exception
How to define a new variable class.

catch exception by type


How to catch exceptions of a specific type and assign the exception a name. php: PHP exceptions when caught must always be assigned a variable name.

finally/ensure
Clauses that are guaranteed to be executed even if an exception is thrown or caught.

start thread
ruby: Ruby 1.8 threads are green threads, and the interpreter is limited to a single operating system thread.

wait on thread
How to make a thread wait for another thread to finish.

File Footnotes
print to standard output
python: print appends a newline to the output. To suppress this behavior, put a trailing comma after the last argument. If given multiple arguments, print joins them with spaces. In Python 2 print parses as a keyword and parentheses are not required:
print "Hello, World!"

ruby: puts appends a newline to the output. print does not.

read from standard input

How to read from standard input.

standard file handles


The names for standard input, standard output, and standard error.

open file
ruby: When File.open is given a block, the file is closed when the block terminates.

open file for writing


How to open a file for writing.

close file
How to close a file.

read line
How to read up to the next newline in a file.

iterate over file by line


How to iterate over a file line by line.

chomp
Remove a newline, carriage return, or carriage return newline pair from the end of a line if there is one. php: chop removes all trailing whitespace. It is an alias for rtrim. perl: chomp modifies its argument, which thus must be a scalar, not a string literal. python: Python strings are immutable. rstrip returns a modified copy of the string. rstrip('\r\n') is not identical to chomp because it removes all contiguous carriage returns and newlines at the end of the string.

ruby: chomp! modifies the string in place. chomp returns a modified copy.

read entire file into array or string


How to read the contents of a file into memory.

write to file
How to write to a file handle.

flush file handle


How to flush a file handle that has been written to.

file test, regular file test


How to test whether a file exists; how to test whether a file is a regular file (i.e. not a directory, special device, or named pipe).

copy file, remove file, rename file


How to copy a file; how to remove a file; how to rename a file.

set file permissions


How to set the permissions on the file. For Perl, Python, and Ruby, the mode argument is in the same format as the one used with the Unix chmod command. It uses bitmasking to get the various permissions which is why it is normally an octal literal. The mode argument should not be provided as a string such as "0755". Python and Ruby will raise an exception if a string is provided. Perl will convert "0755" to 755 and not 0755 which is equal to 493 in decimal.

temporary file
How to create and use a temporary file. Temporary file libraries solve two problems: (1) finding a unused pathname, and (2) putting the file in a location where the system will eventually remove it should the application fail to clean up after itself. php:
tmpfile()

returns a file handle. There is no way to get the pathname and the file is removed when the file handle is closed.

in memory file

How to create a file descriptor which writes to an in-memory buffer.

Directory Footnotes
build pathname
How to construct a pathname without hard coding the system file separator.

dirname and basename


How to extract the directory portion of a pathname; how to extract the non-directory portion of a pathname.

absolute pathname
How to get the get the absolute pathname for a pathname. If the pathname is relative the current working directory will be appended. In the examples provided, if /foo/bar is the current working directory and .. is the relative path, then the return value is foo perl:
File::Spec->rel2abs /foo/bar/..

is similar to Cwd::abs_path except that paths with ".." will not be simplified. If the current working directory is /foo/bar then the output of File::Spec->rel2abs("..") is

iterate over directory by file


How to iterate through the files in a directory. php: The code in the example will stop if a filename which evaluates as FALSE is encountered. One such filename is "0". A safer way to iterate through the directory is:
if ($dir = opendir("/etc")) { while (FALSE !== ($file = readdir($dir))) { echo "$file\n"; } closedir($dir); }

python:
file()

is the file handle constructor. file can be used as a local variable name but doing so hides the constructor. It can still be invoked by the synonym open(), however.

make directory
How to create a directory.

If needed, the examples will create more than one directory. No error will result if a directory at the pathname already exists. An exception will be raised if the pathname is occupied by a regular file, however.

recursive copy
How to perform a recursive copy. If the source is a directory, then the directory and all its contents will be copied.

remove empty directory


How to remove an empty directory. The operation will fail if the directory is not empty.

remove directory and contents


How to remove a directory and all its contents.

directory test
How to determine if a pathname is a directory.

Processes and Environment Footnotes


command line arguments, script name
How to access arguments provided at the command line when the script was run; how to get the name of the script.

getopt
How to process command line options. Command line options are arguments which start with a special character such as a hyphen '-'. Command line option libraries remove options arguments from the ARGV array but leave other arguments for later processing.

get and set environment variable


How to get and set an environment variable. If an environment variable is set the new value is inherited by child processes. php:
putenv

returns a boolean indicating success. The command can fail because when PHP is running in safe mode only some environment variables are writable.

exit

python: It is possible to register code to be executed upon exit:


import atexit atexit.register(print, "goodbye")

It is possible to terminate a script without executing registered exit code by calling os._exit. ruby: It is possible to register code to be executed upon exit:
at_exit { puts "goodbye" }

The script can be terminated without executing registered exit code by calling exit!.

set signal handler


How to register a signal handling function.

executable test
How to test whether a file is executable.

external command
How to execute an external command.

escaped external command


How to prevent shell injection.

backticks
How to invoke an external command and read its output into a variable. The use of backticks for this operation goes back to the Bourne shell (1977). perl: The qx operator can be used with any delimiter. If the opening delimiter is (, [, or {, the closing delimiter must be ), ], or }. python: A more concise solution is:

file = os.popen('ls -l /tmp').read() os.popen

was marked as deprecated in Python 2.6 but it is still available in Python 2.7 and Python 3.2.

ruby:
%x

can be used with any delimiter. If the opening delimiter is (, [, or {, the closing delimiter must be ), ], or }.

PHP
PHP Manual General Style and Syntax Codeigniter Coding Standards Pear PHP Style Guide Apache The PHP interpreter is packaged in 3 different ways: (1) as a standalone executable which can be executed as a CGI script, (2) as a dynamically linked library which adheres to the SAPI of a webserver such as Apache or IIS, and (3) as a standalone executable which can be used to run PHP scripts from the command line. The latter executable is called PHP C From the perspective of a PHP programmer, there no important differences between PHP CGI and PHP SAPI. The programmer should be aware of the following differences between PHP CGI/SAPI and PHP CLI:

PHP CGI/SAPI writes HTTP headers to standard out before any output specified by the program. PHP CLI does not. PHP CLI sets the constants STDIN, STDOUT, and STDERR. PHP CGI/SAPI do not. PHP CLI has no timeout. PHP CGI/SAPI will typically timeout a script after 30 seconds. PHP CGI/SAPI add HTML markup to error messages. PHP CLI does not. PHP CLI does not buffer output, so calling flush is never necessary. PHP CGI/SAPI buffer output.

Perl
perldoc core modules man perlstyle The first character of a perl variable ($, @, %) determines the type of value that can be stored in the variable (scalar, array, hash). Using an array variable (@foo) in a scalar context yields the size of the array, and assigning scalar to an array will set the array to contain a single element. $foo[0] accesses the first element of the array @foo, and $bar{hello} accesses the value stored under hello in the hash %bar. $#foo is the index of the last element in the array @foo. Scalars can store a string, integer, or float. If an operator is invoked on a scalar which contains an incorrect data type, perl will always perform an implicit conversion to the correct data type: non-numeric strings evaluate to zero. Scalars can also contain a reference to a variable, which can be created with a backslash: $baz = \@foo; The original value can be dereferenced with the correct prefix: @$baz. References are how perl creates complex data structures, such as arrays of hashes and arrays of arrays. If $baz contains a reference to an array, then $baz->[0] is the first element of the array. if $baz contains a reference to a hash, $baz->{hello} is the value indexed by hello. The literals for arrays and hashes are parens with comma separated elements. Hash literals must contain an even number of elements, and '=>' can be used in placed of a comma ',' between a key and its value. Square brackets, e.g. [ 1, 2, 3 ], create an array and return a reference to it, and curly brackets, e.g. { hello => 5, bye => 3 }, create a hash and return a reference to it.

By default perl variables are global. They can be made local to the containing block with the my or the local keyword. my gives lexical scope, and local gives dynamic scope. Also by default, the perl interpreter creates a variable whenever it encounters a new variable name in the code. The use strict; pragma requires that all variables be declared with my, local, or our. The last is used to declare global variables. perl functions do not declare their arguments. Any arguments passed to the function are available in the @_ array, and the shift command will operate on this array if no argument is specified. An array passed as an argument is expanded: if the array contains 10 elements, the callee will have 10 arguments in its @_ array. A reference (passing \@foo instead of @foo) can be used to prevent this. Some of perls special variables:

$$: pid of the perl process $0: name of the file containing the perl script (may be a full pathname) $@: error message from last eval or require command $&, $`, $: what last regex matched, part of the string before and after the match $1..$9: what subpatterns in last regex matched

Python
2.7: Language, Standard Library Why Python3 Summary of Backwardly Non-compatible Changes in Python 3 3.2: Language, Standard Library PEP 8: Style Guide for Python Code van Rossum Python uses leading whitespace to indicate block structure. It is not recommended to mix tabs and spaces in leading whitespace, but when this is done, a tab is equal to 8 spaces. The command line options '-t' and '-tt' will warn and raise an error respectively when tabs are used inconsistently for indentation. Regular expressions and functions for interacting with the operating system are not available by default and must be imported to be used, i.e.
import re, sys, os

Identifiers in imported modules must be fully qualified unless imported with from/import:
from sys import path from re import *

There are two basic sequence types: the mutable list and the immutable tuple. The literal syntax for lists uses square brackets and commas [1,2,3] and the literal syntax for tuples uses parens and commas (1,2,3). The dictionary data type literal syntax uses curly brackets, colons, and commas { hello:5, goodbye:7 }. Python 3 adds a literal syntax for sets which uses curly brackets and commas: {1,2,3}. This notation is also available in Python 2.7. Dictionaries and sets are implemented using hash tables and as a result dictionary keys and set elements must be hashable. All values that can be stored in a variable and passed to functions as arguments are objects in the sense that they have methods which can be invoked using the method syntax. Attributes are settable by default. This can be changed by defining a __setattr__ method for the class. The attributes of an object are stored in the __dict__ attribute. Methods must declare the receiver as the first argument. Classes, methods, functions, and modules are objects. If the body of a class, method, or function definition starts with is a string, it is available available at runtime via __doc__. Code examples in the string which are preceded with '>>>' (the python repl prompt) can be executed by doctest and compared with the output that follows.

Ruby
1.8.7 core, stdlib 1.9 core, stdlib ruby-style-guide Batsov The Unofficial Ruby Usage Guide Macdonald Ruby consistently treats all values as objects. Classes are objects. Methods, however, are not objects. The system provided classes are open: i.e. the user can add methods to String, Array, or Fixnum. Another difference from python (and perl) is that ruby only permits single inheritance. However, ruby modules are mix-ins and can be used to add methods to a class via the include statement. Ruby methods can be declared private, and this is enforced by the interpreter. In Ruby, there is no difference between named functions and methods: top level functions are in fact methods defined on the main object. All methods have a receiver which can be referenced with the self: the receiver is not declared as an argument in method signatures (like Python) or shifted off the front of the argument array (like Perl). Ruby has syntax which aids functional programming: a ruby method invocation can be followed by a block, which is a closure. The invoked method can call the block with yield(arg1,). Also, the invoked method can store the block in a variable if its signature ends with &<varname>. The block can then be invoked with <varname>.call(arg1,).

Das könnte Ihnen auch gefallen