比较perl+python

作者:iTech
出处:http://itech.cnblogs.com/

http://hyperpolyglot.org/scripting

 
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("hi\n")‘


$ 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, 2, 3);
# $z set to undef:
($x, $y, $z) = (1, 2);


x, y, z = 1, 2, 3
# raises ValueError:
x, y = 1, 2, 3
# raises ValueError:
x, y, z = 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,2,3);
max(1,2,3);
@a = (1,2,3);
min(@a);
max(@a);


min(1,2,3)
max(1,2,3)
min([1,2,3])
max([1,2,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}s\n";


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‘, 13, 3.7)

fmt = ‘lorem {0} {1} {2}‘
fmt.format(‘ipsum‘, 13, 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", 6, 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, 2, 3, 4);


a = [1, 2, 3, 4]


quote words


@a = qw(do re mi);


none


长度


$#a + 1 or
scalar(@a)


len(a)


空测试


[email protected]


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, 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,7,8]
a.append(9)
a.pop()


插入删除


@a = (6,7,8);
unshift @a, 5;
shift @a;


a = [6,7,8]
a.insert(0,5)
a.pop(0)


数组连接


@a = (1,2,3);
@a2 = (@a,(4,5,6));
push @a, (4,5,6);


a = [1,2,3]
a2 = a + [4,5,6]
a.extend([4,5,6])


初始化


@a = (undef) x 10;


a = [None] * 10
a = [None for i in range(0, 10)]


浅拷贝深拷贝


use Storable ‘dclone‘

my @a = (1,2,[3,4]);
my $a2 = \@a;
my @a3 = @a;
my @a4 = @{dclone(\@a)};


import copy

a = [1,2,[3,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, 2, 3) { print "$i\n" }


for i in [1,2,3]:
  print(i)


遍历


none; use range iteration from 0 to $#a and use index to look up value in the loop body


a = [‘do‘, ‘re‘, ‘mi‘, ‘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,2,3);
reverse @a;
@a = reverse @a;


a = [1,2,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,2,2,3);
my @a2 = uniq @a;
@a = uniq @a;


a = [1,2,2,3]
a2 = list(set(a))
a = list(set(a))


是否存在于数组


7 ~~ @a


7 in a


集合交集

 
{1,2} & {2,3,4}


集合或

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


集合运算

 
{1,2,3} - {2}
{1,2} ^ {2,3,4}


map


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


map(lambda x: x * x, [1,2,3])
# or use list comprehension:
[x*x for x in [1,2,3]]


filter


grep { $_ > 1 } (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]


reduce


use List::Util ‘reduce‘;

reduce { $x + $y } 0, (1,2,3)


# import needed in Python 3 only
from functools import reduce

reduce(lambda x, y: x+y, [1,2,3], 0)


All/any


# cpan -i List::MoreUtils
use List::MoreUtils qw(all any);

all { $_ % 2 == 0 } (1,2,3,4)
any { $_ % 2 == 0 } (1,2,3,4)


all(i%2 == 0 for i in [1,2,3,4])
any(i%2 == 0 for i in [1,2,3,4])


shuffle and sample


use List::Util ‘shuffle‘;

@a = (1, 2, 3, 4);
shuffle(@a);
none


from random import shuffle, sample

a = [1, 2, 3, 4]
shuffle(a)
sample(a, 2)


zip


# 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;


# array of 3 pairs:
a = zip([1,2,3], [‘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",2,"b",3,"c");
%d = @a;


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


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,2,3);
my %d = ("t"=> 1, "f" => 0);
foo(\@a, \%d);


def foo(x, y):
  x[2] = 5
  y[‘f‘] = -1

a = [1,2,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,2,3);
($x, $y) = first_and_second(@a);


def first_and_second(a):
  return a[0], a[1]

x, y = first_and_second([1,2,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 hits\n"
} elsif ( 1 == $n ) {
  print "one hit\n"
} else {
  print "$n hits\n"
}


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 hits\n"; }
  when (1) { print "one hit\n"; }
  default { print "$n hits\n"; }
}


none


while


while ( $i < 100 ) { $i++ }


while i < 100:
  i += 1


c-style for


for ( $i=0; $i <= 10; $i++ ) {
  print "$i\n";
}


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,2,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 "positive\n" if $i > 0;
print "nonzero\n" unless $i == 0;


none


raise exception


die "bad arg";


raise Exception(‘bad arg‘)


catch exception


eval { risky };
if ([email protected]) {
  print "risky failed: [email protected]\n";
}


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


global variable for last exception


$EVAL_ERROR: [email protected]
$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 ipsum\n‘)


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(‘\r\n‘)


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 ipsum\n";
close $f;

print "tmp file: ";
print $f->filename . "\n";


import tempfile

f = tempfile.NamedTemporaryFile(
  prefix=‘foo‘)
f.write(‘lorem ipsum\n‘)
f.close()

print("tmp file: %s" % f.name)


in memory file


my ($f, $s);
open($f, ">", \$s);
print $f "lorem ipsum\n";
$s;


from StringIO import StringIO

f = StringIO()
f.write(‘lorem ipsum\n‘)
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 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


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‘, ‘-l‘, ‘/tmp‘]
files = subprocess.check_output(cmd)


 

完!

时间: 2024-10-20 07:58:26

比较perl+python的相关文章

split function of Perl,Python,Awk

使用中常用到Perl,Python,AWK,R, 虽然Java,C,C++,Vala也学过但是就是不喜欢,你说怎么办. 看来一辈子脚本的命. Perl @rray = split /PATTERN/, STRING, LIMIT 可以看出split由2部分(STRING,PATTERN)和可选的LIMIT部分构成,反正split么,万变不离其宗,都要有 你要split的String,split的界定,split的保存,其他的可以外加 我们举一个简单的例子: > cat test.txt (为了对

shell perl python 剖析

先不用说"无论什么语言都是一种工具".工具是我们身体的一部分,解放军解放台湾靠"小米加***"? "工具无所谓"论可以休矣.对于实际的软件工程工具和平台的选择是很重要的,有时候是致命的1. perl是强大的, perl=shell+awk+sed+一堆命令行工具.   但是反过来也一样shell+awk+sed+一堆命令行工具可以替代perl. 2. shell的简约,可读性比perl好,工具之间通过命令行stdio管道通信,任何一个小部分都可以

awk,perl,python的命令行参数处理

Python,Perl,Bash命令行参数 Part I 日常经常性的和Perl,Python,Bash打交道,但是又经常性的搞混他们之间,在命令行上的特殊性和index的区别,Python真的是人性化到家了,但是命令行上就很原始,但是很有分类感.还是会喜欢Perl一点(至少还可以动脑子,不至于生锈),感觉Perl是个杂合子,而python像胡彦斌,bash像韩红(最近看我是歌手第三季,嘻嘻).Bash就是家常菜了,虽然Perl可以大部分代替Bash的功能,像grep sort map等,但是某

Perl, Python, Erlang, C语言运行速度的比较

主要是通过 蒙特卡罗法来计算圆周率.代码如下: 1)  pi.pl: $time1 = time(); foreach (1..20000000) { my($x, $y) = (rand(), rand()); if(sqrt($x ** 2 + $y ** 2) < 1) { $total += 1; } } $pi = 4.0 * $total / 20000000; $time2 = time(); print "Pi = " , $pi, " time = &

Makefile中怎样调用python和perl文件为自己提供须要的数据

Makefile中怎样调用python和perl文件为自己提供须要的数据,利用print函数对外输出数据 实例代码例如以下 perl.pl #!/usr/bin/perl print("hello, perl") python.py #!/usr/bin/env python print("hello, python") Makefile .PHONY:all PARAM1 := $(shell ./perl.pl) PARAM2 := $(shell ./pyth

Makefile中如何调用python和perl文件为自己提供需要的数据

Makefile中如何调用python和perl文件为自己提供需要的数据,利用print函数对外输出数据 实例代码如下 perl.pl #!/usr/bin/perl print("hello, perl") python.py #!/usr/bin/env python print("hello, python") Makefile .PHONY:all PARAM1 := $(shell ./perl.pl) PARAM2 := $(shell ./python

python学习笔记:第六天(流程控制语句)

Python3 条件控制 1.if 语句 <1> 一般形式 Python中if语句的一般形式如下所示: if condition_1: statement_block_1 elif condition_2: statement_block_2 else: statement_block_3 如果 "condition_1" 为 True 将执行 "statement_block_1" 块语句 如果 "condition_1" 为Fal

Ubuntu16.04下使用sublime text3搭建Python IDE

本来是想用pycharm,但你看它的内存要求,我的虚拟机一共也就1G Vim太别扭了,就算有代码颜色,不能自动对齐,不能规范格式,跳转到函数定义,显示文档,要配置起来太费劲,所以就尝试着用sublime text3 来搭建Python IDE 安装sublime text3 目前最简单的方法是通过ppa安装,打开终端,输入以下命令: sudo add-apt-repository ppa:webupd8team/sublime-text-3 sudo apt-get update sudo ap

Python 中数据的序列化和反序列化(json处理)

概念: JSON(JavaScript Object Notation):是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等). 这些