|
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)
|
__________________________________________
|