? |
perl?(1987) |
python?(1991) |
基础 |
模块导入 |
use?strict; |
import?os,re,sys |
版本查看 ? |
$ perl?-v |
$ python -V |
执行脚本 ? |
$ perl foo.pl |
$ python foo.py |
交互模式 ? |
$ perl -de 0 |
$ python |
执行语句 |
$ perl -e 'print("hin")' |
$ python -c "print('hi')" |
语句分隔 ? |
; |
n (newline) or?; |
语句块 ? |
{} |
Indent |
注释 ? |
# comment |
# comment |
多行注释 ? |
=for comment line another line =cut |
use triple quote string literal: '''comment line another line''' |
变量和操作符 |
赋值? |
$v = 1; |
v?= 1 |
赋值 ? |
($x,$y,$z) = (1,2,3); # 3 is discarded: ($x,$y) = (1,3); # $z set to undef: ($x,2); |
x,?y,?z?= 1,3 # raises ValueError: x,?y?= 1,2 |
交换 ? |
($x,$y) = ($y,$x); |
x,?y?= y,x |
操作符 |
+= -= *=?none?/= %=?**= .= x= &&=?||= ^= <<= >>= &= |= ^= |
# do not return values: += -= *= /=?//= %=?**= += *= &=?|= ^= <<= >>= &= |= ^= |
自增 ? |
my?$x?= 1; my?$y?= ++$x; my?$z?=?--$y; |
none |
局部变量 ? |
my?$v; my?(@a,?%d); my?$x?= 1; my?($y,?$z) = (2,3); |
# in function body: v?=?None a,?d?= [],{} x?= 1 y,?z?= 2,3 |
全局变量 |
our?($g1,?$g2) = (7,8); sub?swap_globals?{ ??($g1,$g2) = ($g2,$g1); } |
g1,?g2?= 7,8 def?swap_globals(): ??global?g1,g2 ??g1,g2 = g2,g1 |
常量 ? |
use?constant?PI?=> 3.14; |
# uppercase identifiers # constant by convention PI?= 3.14 |
空 ? |
undef |
None |
空测试 ? |
!?defined?$v |
v ==?None v?is?None |
访问未定义变量 ? |
error under?use strict;?otherwise?undef |
raises?NameError |
真假 ? |
1?"" |
True False |
假 ? |
undef?0?0.0?"" "0"?() |
False?None?0?0.0?''?[] {} |
逻辑运算 ? |
&&?||?! lower precedence: and or xor not |
and or not |
条件 ? |
$x > 0 ? $x : -$x |
x?if?x > 0?else?-x |
比较 ? |
numbers only:?== != > < >= <= strings:?eq ne gt lt ge le |
comparison operators are chainable: == != > < >= <= |
数学运算 |
类型转化 ? |
7 +?"12" 73.9 +?".037" "value: "?. 8 |
7 +?int('12') 73.9 +?float('.037') 'value: '?+?str(8) |
算术运算 ? |
+ - * /?none?%?** |
+ - * / // %?** |
取余 ? |
int?( 13 / 5 ) none |
13 // 5 q,r =?divmod(13,5) |
浮点除法 ? |
13 / 5 |
float(13) / 5 # Python 3: 13 / 5 |
数学函数 ? |
use?Math::Trig?qw( ??tan asin acos atan);
sqrt exp log sin cos?tan asin acos atan?atan2 |
from?math?import?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) round($x,0) ceil($x) floor($x) abs($x) |
import?math
int(x) int(round(x)) math.ceil(x) math.floor(x) abs(x) |
最大最小 ? |
use?List::Util?qw(min max);
min(1,3); max(1,3); @a?= (1,3); min(@a); max(@a); |
min(1,3) max(1,3) min([1,3]) max([1,3]) |
除0 ? |
error |
raises?ZeroDivisionError |
大整数 ? |
converted to float; use?Math::BigInt?to create arbitrary length integers |
becomes arbitrary length integer of type long |
大浮点数 ? |
inf |
raises?OverflowError |
随机数 |
int(rand() * 100) rand() none |
import?random
random.randint(0,99) random.random() random.gauss(0,1) |
随机数 |
srand?17;
my?$sd?=?srand; srand($sd); |
import?random
random.seed(17) sd?= random.getstate() random.setstate(sd) |
位操作 ? |
<< >> & | ^ ~ |
<< >> & | ^ ~ |
其他进制 |
0b101010 052 0x2a |
0b101010 052 0x2a |
字符串操作 |
字符串 ? |
"don't say "no"" 'don't say "no"' |
'don't say "no"' "don't say "no"" "don't "?'say "no"' '''don't say "no"''' """don't say "no"""" |
多行字符串 ? |
yes |
triple quote literals only |
转义 ? |
double quoted: a b cx?e f n r t xhh?x{hhhh} ooo???Perl 5.14:?o{ooo}
single quoted: ' |
single and double quoted: newline? ' " a b f n r t v ooo?xhh
Python 3: uhhhh?Uhhhhhhhh |
变量替换 ? |
my?$count?= 3; my?$item?=?"ball"; print?"$count ${item}sn"; |
count?= 3 item?=?'ball' print(‘%s %s’ % (count,item)) |
sprintf ? |
my?$fmt?=?"lorem %s %d %f"; sprintf($fmt,?"ipsum",13,3.7) |
'lorem %s %d %f'?% ('ipsum',3.7)
fmt?=?'lorem {0} {1} {2}' fmt.format('ipsum',3.7) |
here document ? |
$word =?"amet"; $s =?<<EOF; lorem ipsum dolor sit $word EOF |
‘’’ ‘’’ |
字符串连接 ? |
my?$s?=?"Hello,"; my?$s2?= $s .?"World!"; |
s?=?'Hello,' s2?= s +?'World!'
juxtaposition can be used to concatenate literals: s2?=?'Hello,' "World!" |
字符串复制 ? |
my?$hbar?=?"-"?x?80; |
hbar?=?'-'?* 80 |
字符串分隔 |
split(/s+/,?"do re mi fa") split(/s+/,?"do re mi fa",2) split(/(s+)/,?"do re mi fa"); split(//,?"abcd") |
'do re mi fa'.split() 'do re mi fa'.split(None,1) re.split('(s+)',?'do re mi fa') list('abcd') |
字符串连接 ? |
join(" ",?qw(do re mi fa)) |
' '.join(['do',?'re',?'mi',?'fa']) |
字符串大小写 |
uc("lorem") lc("LOREM") ucfirst("lorem") |
'lorem'.upper() 'LOREM'.lower() 'lorem'.capitalize() |
字符串strip ? |
# cpan -i Text::Trim use?Text::Trim;
trim?" lorem " ltrim?" lorem" rtrim?"lorem " |
' lorem '.strip() ' lorem'.lstrip() 'lorem '.rstrip() |
字符串格式化 ? |
sprintf("%-10s",?"lorem") sprintf("%10s",?"lorem") |
'lorem'.ljust(10) 'lorem'.rjust(10) |
字符串长度 ? |
length("lorem") |
len('lorem') |
字符串index ? |
index("lorem ipsum",?"ipsum") rindex("do re re",?"re") return?-1?if not found |
'do re re'.index('re') 'do re re'.rindex('re') raise?ValueError?if not found |
子字符串 ? |
substr("lorem ipsum",6,5) |
'lorem ipsum'[6:11] |
访问字符串中字母 |
can't use index notation with strings: substr("lorem ipsum",1) |
'lorem ipsum'[6] |
字母数字转化 ? |
chr(65) ord("A") |
chr(65) ord('A') |
正则表达式 |
字符串或 |
/lorem|ipsum/ qr(/etc/hosts) |
re.compile('lorem|ipsum') none |
特殊字符 |
char class abbrevs: . d D h H s S v V w W
anchors:?^ $ A b B z Z |
char class abbrevs: . d D s S w W
anchors:?^ $ A b B Z |
正则表达式匹配 ? |
if?($s =~?/1999/) { ??print?"party!n"; } |
if?re.search('1999',s): ??print('party!') |
忽略大小写 |
"Lorem"?=~?/lorem/i |
re.search('lorem',?'Lorem',re.I) |
选项 ? |
i m s p x |
re.I re.M re.S re.X |
替换 ? |
my?$s?=?"do re mi mi mi"; $s =~?s/mi/ma/g; |
s?=?'do re mi mi mi' s?= re.compile('mi').sub('ma',s) |
group ? |
$rx =?qr/(d{4})-(d{2})-(d{2})/; "2010-06-03"?=~ $rx; ($yr,$mo,$dy) = ($1,$2,$3); |
rx?=?'(d{4})-(d{2})-(d{2})' m?= re.search(rx,?'2010-06-03') yr,?mo,?dy?= m.groups() |
findall ? |
my?$s?=?"dolor sit amet"; @a?= $s =~?m/w+/g; |
s?=?'dolor sit amet' a?= re.findall('w+',s) |
匹配引用 |
"do do"?=~?/(w+) 1/
my?$s?=?"do re"; $s =~?s/(w+) (w+)/$2 $1/; |
none
rx?= re.compile('(w+) (w+)') rx.sub(r'2 1',?'do re') |
日期时间 |
日期时间类型 ? |
Time::Piece?if?use Time::Piece?in effect,otherwise tm array |
datetime.datetime |
当前日期时间 |
use?Time::Piece;
my?$t?=?localtime(time); my?$utc?=?gmtime(time); |
import?datetime
t?= datetime.datetime.now() utc?= datetime.datetime.utcnow() |
与epoch转化 |
use?Time::Local; use?Time::Piece;
my?$epoch?= timelocal($t); my?$t2?=?localtime(1304442000); |
from?datetime?import?datetime?as?dt
epoch?=?int(t.strftime("%s")) t2?= dt.fromtimestamp(1304442000) |
当前epoch |
$epoch =?time; |
import?datetime
t?= datetime.datetime.now() epoch?=?int(t.strftime("%s")) |
strftime |
use?Time::Piece;
$t =?localtime(time); $fmt =?"%Y-%m-%d %H:%M:%S"; print?$t->strftime($fmt); |
t.strftime('%Y-%m-%d %H:%M:%S') |
默认格式 |
Tue Aug 23?19:35:19?2011 |
2011-08-23?19:35:59.411135 |
字符串转为时间strptime |
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); |
from?datetime?import?datetime
s?=?'2011-05-03?10:00:00' fmt?=?'%Y-%m-%d %H:%M:%S' t?= datetime.strptime(s,fmt) |
解析日期 |
# cpan -i Date::Parse use?Date::Parse;
$epoch = str2time("July 7,1999"); |
# pip install python-dateutil import?dateutil.parser
s?=?'July 7,1999' t?= dateutil.parser.parse(s) |
时间差 |
Time::Seconds?object if?use Time::Piece?in effect; not meaningful to subtract tm arrays |
datetime.timedelta?object |
时间运算 |
use?Time::Seconds;
$now =?localtime(time); $now += 10 * ONE_MINUTE() + 3; |
import?datetime
delta?= datetime.timedelta( ??minutes=10, ??seconds=3) t?= datetime.datetime.now() + delta |
时区 |
Time::Piece?has local timezone if created withlocaltime?and UTC timezone if created with?gmtime;?tm arrays have no timezone or offset info |
a?datetime?object has no timezone information unless a?tzinfo?object is provided when it is created |
timezone name; offset from UTC; 是否夏令时 |
# cpan -i DateTime use?DateTime; use?DateTime::TimeZone;
$dt = DateTime->now(); $tz = DateTime::TimeZone->new( ??name=>"local");
$tz->name; $tz->offset_for_datetime($dt) / ??3600; $tz->is_dst_for_datetime($dt); |
import?time
tm?= time.localtime() ?? time.tzname[tm.tm_isdst] (time.timezone / -3600) + tm.tm_isdst tm.tm_isdst |
microseconds |
use?Time::HiRes?qw(gettimeofday);
($sec,$usec) = gettimeofday; |
t.microsecond |
sleep |
a float argument will be truncated to an integer: sleep?1; |
import?time
time.sleep(0.5) |
timeout |
eval?{ ??$SIG{ALRM}=?sub?{die?"timeout!";}; ??alarm?5; ??sleep?10; }; alarm?0; |
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) |
数组 |
定义 ? |
@a?= (1,3,4); |
a?= [1,4] |
quote words ? |
@a?=?qw(do re mi); |
none |
长度 ? |
$#a?+ 1?or scalar(@a) |
len(a) |
空测试 ? |
!@a |
not?a |
使用 ? |
$a[0] |
a[0] |
更新 ? |
$a[0] =?"lorem"; |
a[0] =?'lorem' |
越界访问 |
@a?= (); evaluates as?undef: $a[10]; increases array size to 11: $a[10] =?"lorem"; |
a?= [] raises?IndexError: a[10] raises?IndexError: a[10] =?'lorem' |
index |
use?List::Util?'first';
@a?=?qw(x y z w); $i = first {$a[$_]?eq?"y"} (0..$#a); |
a?= ['x',?'y',?'z',?'w'] i?= a.index('y') |
子数组 ? |
select 3rd and 4th elements: @a[2..3] splice(@a,2) |
select 3rd and 4th elements: a[2:4] none |
子数组 ? |
@a[1..$#a] |
a[1:] |
添加删除 ? |
@a?= (6,7,8); push?@a,9; pop?@a; |
a?= [6,8] a.append(9) a.pop() |
插入删除 ? |
@a?= (6,8); unshift?@a,5; shift?@a; |
a?= [6,8] a.insert(0,5) a.pop(0) |
数组连接 |
@a?= (1,3); @a2?= (@a,(4,5,6)); push?@a,6); |
a?= [1,3] a2?= a + [4,6] a.extend([4,6]) |
初始化 |
@a?= (undef)?x?10; |
a = [None] * 10 a = [None for?i?in range(0,10)] |
浅拷贝深拷贝 |
use?Storable?'dclone'
my?@a?= (1,[3,4]); my?$a2?= @a; my?@a3?=?@a; my?@a4?= @{dclone(@a)}; |
import?copy
a?= [1,4]] a2?= a a3?=?list(a) a4?= copy.deepcopy(a) |
数组作为函数参数 |
each element passed as separate argument; use reference to pass array as single argument |
parameter contains address copy |
遍历 ? |
for?$i?(1,3) {?print?"$in"?} |
for?i?in?[1,3]: ??print(i) |
遍历 |
none; use range iteration from?0?to?$#a?and use index to look up value in the loop body |
a?= ['do',?'fa'] for?i,s?in?enumerate(a): ??print('%s at index %d'?% (s,i)) |
range |
for?$i?(1..1_000_000) { ??code } |
range?replaces?xrange?in Python 3: for?i?in xrange(1,1000001): ??code |
range数组 |
@a?= 1..10; |
a?=?range(1,11) Python 3: a?=?list(range(1,11)) |
翻转 |
@a?= (1,3); reverse?@a; @a?=?reverse?@a; |
a?= [1,3] a[::-1] a.reverse() |
排序 |
@a?=?qw(b A a B); sort?@a; @a?=?sort?@a; sort?{?lc($a)?cmp?lc($b) }?@a; |
a?= ['b',?'A',?'a',?'B'] sorted(a) a.sort() a.sort(key=str.lower) |
去重复 |
use?List::MoreUtils?'uniq';
my?@a?= (1,3); my?@a2?= uniq?@a; @a?= uniq?@a; |
a?= [1,3] a2?=?list(set(a)) a?=?list(set(a)) |
是否存在于数组 ? |
7 ~~?@a |
7?in?a |
集合交集 ? |
? |
{1,2} & {2,4} |
集合或 ? |
? |
{1,2} | {2,4} |
集合运算 |
? |
{1,3} - {2} {1,2} ^ {2,4} |
map ? |
map?{ $_ * $_ } (1,3) |
map(lambda?x: x * x,[1,3]) # or use list comprehension: [x*x for x in [1,3]] |
filter ? |
grep?{ $_ > 1 } (1,3) |
filter(lambda?x: x > 1,3]) # or use list comprehension: [x for x in [1,3] if x > 1] |
reduce ? |
use?List::Util?'reduce';
reduce { $x + $y } 0,(1,3) |
# import needed in Python 3 only from?functools?import reduce
reduce(lambda?x,y: x+y,3],0) |
All/any ? |
# cpan -i List::MoreUtils use?List::MoreUtils?qw(all any);
all { $_ % 2 == 0 } (1,4) any { $_ % 2 == 0 } (1,4) |
all(i%2 == 0?for?i?in?[1,4]) any(i%2 == 0?for?i?in?[1,4]) |
shuffle and sample |
use?List::Util?'shuffle';
@a?= (1,4); shuffle(@a); none |
from?random?import?shuffle,sample
a?= [1,4] shuffle(a) sample(a,2) |
zip ? |
# cpan -i List::MoreUtils use?List::MoreUtils?'zip';
@nums?= (1,3); @lets?=?qw(a b c); # flat array of 6 elements: @a?= zip?@nums,?@lets; |
# array of 3 pairs: a?= zip([1,['a',?'b',?'c']) |
字典对象 |
定义 ? |
%d?= (?t?=> 1,?f?=> 0 ); |
d?= {?'t':1,?'f':0 } |
size ? |
scalar(keys?%d) |
len(d) |
lookup ? |
$d{"t"} |
d['t'] |
out-of-bounds behavior ? |
%d?= (); evaluates as?undef: $d{"lorem"}; adds key/value pair: $d{"lorem"} =?"ipsum"; |
d?= {} raises?KeyError: d['lorem'] adds key/value pair: d['lorem'] =?'ipsum' |
is key present ? |
exists?$d{"y"} |
'y'?in?d |
delete entry |
%d?= ( 1 =>?"t",0 =>?"f"?); delete?$d{1}; |
d?= {1:?True,0:?False} del?d[1] |
from array of pairs,from even length array |
@a?= (1,"a","b","c"); %d?=?@a; |
a?= [[1,'a'],[2,'b'],'c']] d?=?dict(a)
a?= [1,'a','b','c'] d?=?dict(zip(a[::2],a[1::2])) |
merge |
%d1?= (a=>1,?b=>2); %d2?= (b=>3,?c=>4); %d1?= (%d1,?%d2); |
d1?= {'a':1,?'b':2} d2?= {'b':3,?'c':4} d1.update(d2) # {'a': 1,'c': 4,'b': 3} |
invert |
%to_num?= (t=>1,?f=>0); %to_let?=?reverse?%to_num; |
to_num?= {'t':1,?'f':0} # dict comprehensions added in 2.7: to_let?= {v:k?for?k,v ??in?to_num.items()} |
iteration ? |
while?( ($k,$v) =?each?%d?) { ??code } |
for?k,v?in?d.iteritems(): ??code
Python 3: for?k,v?in?d.items(): ??code |
keys and values as arrays |
keys?%d values?%d |
d.keys() d.values()
Python 3: list(d.keys()) list(d.values()) |
default value,computed value |
my?%counts; $counts{'foo'} += 1
define a tied hash for computed values and defaults other than zero or empty string |
from?collections?import?defaultdict
counts?= defaultdict(lambda: 0) counts['foo'] += 1
class?Factorial(dict): ??def?__missing__(self,k): ????if?k > 1: ??????return?k *?self[k-1] ????else: ??????return?1
factorial?= Factorial() |
函数 |
函数申明 ? |
sub?add?{?$_[0] +?$_[1] }
sub?add?{ ??my?($a,?$b) =?@_; ??$a + $b; } |
def?add(a,b): ??return?a+b |
函数调用 |
add(1,2);
parens are optional: add 1,2; |
add(1,2) |
参数丢失 ? |
set to?undef |
raises?TypeError |
参数默认值 ? |
sub?my_log?{ ??my?$x?=?shift; ??my?$base?=?shift?// 10;
??log($x)/log($base); }
my_log(42); my_log(42,?exp(1)); |
import?math
def?my_log(x,base=10): ??return?math.log(x)/math.log(base)
my_log(42) my_log(42,math.e) |
变长参数 |
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])) |
命名参数 ? |
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) |
pass number or string by reference ? |
sub?foo?{ ??$_[0] += 1; ??$_[1] .=?"ly"; }
my?$n?= 7; my?$s?=?"hard"; foo($n,$s); |
not possible |
pass array or dictionary by reference ? |
sub?foo?{ ??$_[0][2] = 5; ??$_[1]{"f"} = -1; }
my?@a?= (1,3); my?%d?= ("t"=> 1,?"f"?=> 0); foo(@a,%d); |
def?foo(x,y): ??x[2] = 5 ??y['f'] = -1
a?= [1,3] d?= {'t':1,?'f':0} foo(a,d) |
return value ? |
return?arg or last expression evaluated |
return?arg or?None |
multiple return values ? |
sub?first_and_second?{ ??return?($_[0],?$_[1]); } @a?= (1,3); ($x,$y) = first_and_second(@a); |
def?first_and_second(a): ??return?a[0],a[1]
x,?y?= first_and_second([1,3]) |
lambda declaration ? |
$sqr =?sub?{?$_[0] *?$_[0] } |
body must be an expression: sqr?=?lambda?x: x * x |
lambda invocation |
$sqr->(2) |
sqr(2) |
function reference |
my?$func?= &;add; |
func?= add |
function with private state |
use?feature?state;
sub?counter?{ ??state $i = 0; ??++$i; }
print?counter() .?"n"; |
# state not private: def?counter(): ??counter.i += 1 ??return?counter.i
counter.i = 0 print(counter()) |
closure |
sub?make_counter?{ ??my?$i?= 0; ??return?sub?{ ++$i }; } my?$nays?= make_counter; print?$nays->() .?"n"; |
# Python 3: def?make_counter(): ??i = 0 ??def?counter(): ????nonlocal i ????i += 1 ????return?i ??return?counter
nays = make_counter() |
generator |
none |
def?make_counter(): ??i = 0 ??while True: ????i += 1 ????yield?i
nays?= make_counter() print(nays.next()) |
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) |
流程控制 |
if ? |
if?( 0 == $n ) { ??print?"no hitsn" }?elsif?( 1 == $n ) { ??print?"one hitn" }?else?{ ??print?"$n hitsn" } |
if?0 == n: ??print('no hits') elif?1 == n: ??print('one hit') else: ??print(str(n) +?' hits') |
switch |
use?feature?'switch';
given ($n) { ??when (0) {?print?"no hitsn"; } ??when (1) {?print?"one hitn"; } ??default {?print?"$n hitsn"; } } |
none |
while ? |
while?( $i < 100 ) { $i++ } |
while?i < 100: ??i += 1 |
c-style for ? |
for?( $i=0; $i <= 10; $i++ ) { ??print?"$in"; } |
none |
Foreach |
@a = (1..5); foreach? (@a) { ?? print "$_n"; } ? @a = (1..5); for (@a) { ?? print "$_n" } |
a = ['do','re','mi','fa'] for i,s in enumerate(a): ? print('%s at index %d' % (s,i)) ? for i in [1,3]: ? print(i) |
break,continue,redo ? |
last next redo |
break continue?none |
control structure keywords |
do else elsif for foreach goto if unless until while |
elif else for if while |
what do does |
executes following block and returns value of last statement executed |
raises?NameError?unless a value was assigned to it |
statement modifiers ? |
print?"positiven"?if?$i > 0; print?"nonzeron"?unless?$i == 0; |
none |
raise exception ? |
die?"bad arg"; |
raise?Exception('bad arg') |
catch exception ? |
eval?{ risky }; if?($@) { ??print?"risky failed: $@n"; } |
try: ??risky() except: ??print('risky failed') |
global variable for last exception |
$EVAL_ERROR: $@ $OS_ERROR:?$! $CHILD_ERROR: $? |
last exception:?sys.exc_info()[1] |
define exception |
none |
class?Bam(Exception): ??def?__init__(self): ????super(Bam,?self).__init__('bam!') |
catch exception by type |
none |
try: ??raise?Bam() except?Bam?as?e: ??print(e) |
finally/ensure ? |
none |
acquire_resource() try: ??risky() finally: ??release_resource() |
start thread ? |
use?threads;
$func =?sub?{?sleep?10 }; $thr = threads->new($func); |
class?sleep10(threading.Thread): ??def?run(self): ????time.sleep(10)
thr?= sleep10() thr.start() |
wait on thread ? |
$thr->join; |
thr.join() |
文件和输出 |
print to standard output ? |
print?"Hello,World!n"; |
print('Hello,World!') |
read from standard input |
$line = <STDIN>; |
line?= sys.stdin.readline() |
standard file handles ? |
STDIN STDOUT STDERR |
sys.stdin sys.stdout sys.stderr |
open file ? |
open?my?$f,?"/etc/hosts";?or open?FILE,?"/etc/hosts"; |
f?=?open('/etc/hosts') |
open file for writing ? |
open?my?$f,?">/tmp/perl_test";?or open?FILE,?">/tmp/perl_test"; |
f?=?open('/tmp/test',?'w') |
open file for append |
|
with open('/tmp/test')?as?f: ??f.write('lorem ipsumn') |
close file ? |
close?$f;?or close?FILE; |
f.close() |
read line ? |
$line = <$f>;?or $line = <FILE>; |
f.readline() |
iterate over file by line ? |
while?($line = <$f>) { |
for?line?in?f: |
chomp ? |
chomp?$line; |
line?= line.rstrip('rn') |
read entire file into array or string |
@a?= <$f>; $s = do { local $/; <$f> }; |
a?= f.readlines() s?= f.read() |
write to file ? |
print?$f?"lorem ipsum"; |
f.write('lorem ipsum') |
flush file handle ? |
use?IO::Handle;
$f->flush(); |
f.flush() |
file test,regular file test ? |
If (-e?"/etc/hosts") {print exist;} -f?"/etc/hosts" |
os.path.exists('/etc/hosts') os.path.isfile('/etc/hosts') |
copy file,remove file,rename file |
use?File::Copy;
copy("/tmp/foo",?"/tmp/bar"); unlink?"/tmp/foo"; move("/tmp/bar",?"/tmp/foo"); unlink(); |
import?shutil
shutil.copy('/tmp/foo',?'/tmp/bar') os.remove('/tmp/foo') shutil.move('/tmp/bar',?'/tmp/foo') os.remove() |
set file permissions |
chmod?0755,?"/tmp/foo"; |
os.chmod('/tmp/foo',0755) |
temporary file |
use?File::Temp;
$f = File::Temp->new(); print?$f?"lorem ipsumn"; close $f;
print?"tmp file: "; print?$f->filename .?"n"; |
import?tempfile
f?= tempfile.NamedTemporaryFile( ??prefix='foo') f.write('lorem ipsumn') f.close()
print("tmp file: %s"?% f.name) |
in memory file |
my?($f,?$s); open($f,?">",$s); print?$f?"lorem ipsumn"; $s; |
from?StringIO?import?StringIO
f?= StringIO() f.write('lorem ipsumn') s?= f.getvalue()
Python 3 moved?StringIO?to the?io?module |
目录操作 |
build pathname |
use?File::Spec;
File::Spec->catfile("/etc",?"hosts") |
os.path.join('/etc',?'hosts') |
dirname and basename |
use?File::Basename;
print?dirname("/etc/hosts"); print?basename("/etc/hosts"); |
os.path.dirname('/etc/hosts') os.path.basename('/etc/hosts') |
absolute pathname |
use?Cwd;
Cwd::abs_path("..") |
os.path.abspath('..') |
iterate over directory by file |
use?File::Basename;
while?(?</etc/*>?) { ???print?basename($_) .?"n"; } |
for?filename?in?os.listdir('/etc'): ??print(filename) |
make directory |
use?File::Path?'make_path';
make_path?"/tmp/foo/bar"; |
dirname?=?'/tmp/foo/bar' if not?os.path.isdir(dirname): ??os.makedirs(dirname) |
recursive copy |
# cpan -i File::Copy::Recursive use?File::Copy::Recursive?'dircopy';
dircopy?"/tmp/foodir", ??"/tmp/bardir"; |
import?shutil
shutil.copytree('/tmp/foodir', ??'/tmp/bardir') |
remove empty directory |
rmdir?"/tmp/foodir"; |
os.rmdir('/tmp/foodir') |
remove directory and contents |
use?File::Path?'remove_tree';
remove_tree?"/tmp/foodir"; |
import?shutil
shutil.rmtree('/tmp/foodir') |
directory test ? |
-d?"/tmp" |
os.path.isdir('/tmp') |
命令行操作 |
command line args,script name ? |
scalar(@ARGV) $ARGV[0]?$ARGV[1]?etc $0 |
len(sys.argv)-1 sys.argv[1] sys.argv[2]?etc sys.argv[0] |
getopt |
use?Getopt::Long;
my?($src,?$help);
sub?usage?{ ??print?"usage: $0?--f SRCn"; ??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 |
get and set environment variable ? |
$ENV{"HOME"}
$ENV{"PATH") =?"/bin"; |
os.getenv('HOME')
os.environ['PATH'] =?'/bin' |
exit ? |
exit?0; |
sys.exit(0) |
set signal handller ? |
$SIG{INT} =?sub?{ ??die?"exiting…n"; }; |
import?signal
def?handler(signo,frame): ??print('exiting…') ??exit?-1 signal.signal(signal.SIGINT,handler) |
executable test |
-x?"/bin/ls" |
os.access('/bin/ls',os.X_OK) |
external command ? |
system("ls -l /tmp") == 0?or ??die?"ls failed"; |
if?os.system('ls -l /tmp'): ??raise?Exception('ls failed') |
escaped external command ? |
$path = <>; chomp($path); system("ls",?"-l",$path) == 0?or ??die?"ls failed"; |
import?subprocess
cmd?= ['ls',?'-l',?'/tmp'] if?subprocess.call(cmd): ??raise?Exception('ls failed') |
backticks ? |
my?$files?=?`ls -l /tmp`;?or my?$files?=?qx(ls); |
import?subprocess
cmd?= ['ls',?'/tmp'] files?= subprocess.check_output(cmd) |
__________________________________________ |