Python-Perl cheatsheet
Contents
Cheatsheet
This is so far based on my study of Learning Perl (O'Reilly), also known as "the llama book", plus stuff I found on the web.
See also the Perl Phrasebook on wiki.python.org
what | Python | Perl | notes |
---|---|---|---|
null type | None | undef | not exactly identical |
String concatenation | "py"+"thon" | "pe"."rl" | |
if x == y | if ( $x == $y ) and if ( $x eq $y) | Perl requires parenthesis in a comparison (same for while). Perl uses different comparators for numbers and strings | |
Arrays | |||
declare a list | [1,2,3] | (1,2,3) | note that arrays contain only scalars! (1,2, (3,4), 5) becomes (1,2,3,4,5) |
array length | len(array) | $#array + 1 | Python returns the length of array. Perl gives me the index of the last element. Also, the array value in a scalar context is (usually) its size. |
range(1,100) | (1..100) | ||
create a list from whitespaced values | "fred barney wilma dino".split() | qw( fred barney wilma dino); | You can use separators others than parenthesis, e.g. qw ! fred barney wilma dino ! |
multiple assignment | fred, barney, dino = "flintstone", "rubble", None | ($fred, $barney, $dino) = ("flintstone", "rubble", undef); | |
pretty-print array | print array | print "@array\n"; | Simply using print @array will print the contents but without spacing, so that (1,2,3) becomes 123. |
array concatenation | a+b | (@a, @b) | you can also mix like (@a, 3, @b, undef) |
array.append(item) | push @array, item; | See also Perl's unshift() for attaching to the front of array | |
val = array.pop() | val = pop @array; | See also Perl's shift() for removing from the front of array | |
List iteration | for item in array | foreach $item (@array) | Note that $item is the real element of @array, so if you modify $item, you modify the array content |
list.reverse() | @list = reverse @list; | Python is in place, Perl is not. Same for sort. | |
Check if item in list | if item in list :... | if ( grep {$_ eq $element} @array ) { ... | TIMTOWDI; see also using hashes and exists() |
Index of item | list.index(item) | my( $index )= grep { $array[$_] eq $search_for } 0..$#array; | See Perlmonks.org |
Mappings (dictionaries / hashes) | |||
Define hash | dict = { 'a':1 , 'b':2 } | hash = ( 'a'=> 1, 'b'=> 2, ) | |
Retrieve value | dict[key] | $hash{$key} | |
Invert a hash | inverted_dict = dict([[v,k] for k,v in mydict.items()]) | %inverted_hash = reverse %hash; | |
Keys | keys = dict.keys() | @keys = keys %hash; | |
Values | vals = dict.values() | @vals = values %hash; | |
Iterating a hash | for key in dict.keys(): dict[key]... | while ( ($key, $val) = each %hash) {...} | Notice the each function -iterates and the assigment is false when there are no more couples. Notice also, if you want keys sorted, you can use foreach $key (sort keys %hash) {...} , which is similar to the Python case. |
Creating an hash from two arrays | for key,val in zip(keys,vals): dict[key]=val | @dict{@keys} = @vals | See hash slicing. |
Functions and subroutines | |||
Subroutine/function declaration | def function(): ... | sub function { ... } | |
return x | return x or [last evaluated expression is return value] | Perl has an explicit return statement, but it's facultative. A return-less sub won't return "undef", but the last expression evaluated! | |
Arguments of a function | def function(arg1,arg2...) | sub function { ... $_[0] , $[1] ... } | Perl doesn't have explicit arguments; args are stored in the @_ default array. |
Name of argument variables | def function(arg1,arg2...) | sub function { my($arg1, $arg2) = @_; } | You can name arguments by declaring them using the @_ default array |
Static variables in function scope | (define a generator ; see yield ) ; (use namespace within function, like def foo(): foo.myvar=1) | state $myvar=1; | Defines a variable which is statically defined but within function namespace -so it's not resetted when function is called, it maintains its state. |
Returning more than one array/dictionary | return a,b | return \@array, \%hash; | In Perl, functions collapse all input in a single array and all output in a single array. You have to play with references. |
Input / output | |||
x = raw_input() | $x = <STDIN>; | Interestingly if you use a list context, like in @x = <STDIN> , you get multiline stdin input. | |
sys.argv | @ARGV | ||
Program's own name | sys.argv[0] | $0 | |
Multiple file arguments stream | see fileinput module | <> | Comntains sequentially all the file stream from all files in program arguments, like ./script.pl file1 file2 file3 |
Open a file stream for reading | f = open('test.txt') | open TEST, "test.txt"; | Use uppercase, it's good practice. |
Open a file stream for writing | f = open('test.txt','w') | open TEST, ">test.txt"; | |
Open a file stream for appending | f = open('test.txt','a') | open TEST, ">>test.txt"; | |
Close file | f.close() | close TEST; | |
Error handling | |||
Raise exception | raise | die | |
Catch exception | try: ... except: ... | eval { ... } or do {...} | |
Operating system interaction | |||
Environment variables | os.environ | %ENV | |
Miscellaneous | |||
Save data structures to disk | pickle module | Storable module | Perl has a quite long list of modules to save data structures to disk |
Traps
Static arrays
- To have a valid
state @array
- you need to
use 5.010;
while/foreach memory consumption
- This:
while (<STDIN>) { ...
- reads one line at a time.
- This:
foreach (<STDIN>) { ...
- instead loads all STDIN into memory before processing it!
Print a hash
- If you do
print "%hash";
- it will NOT interpolate and write the hash! it will dumbly write the string "%hash".
- You can unwind the array by
@unwind_hash = %hash
(but it is difficult to read) or you have to write your helper function.