2009-03-09

perl,python的"数组","字典"类型比较与使用

python的字典类型和perl的hash类型差不多

python用花括号'{}'和冒号':'来定义一个字典
$dict={ 'a':1, 'b':2, 'c':3 }
$dict
{'a': 1, 'c': 3, 'b': 2}

perl用括号'()'和在箭头'=>'(或者逗号)来定义一个hash.此外,perl的hash类型的变量要用'%'前缀来声明
%hash = ( 'a' => 1, 'b' => 2, 'c' => 3 );
print %hash;
c3a1b2


引用的格式也差不多.
对上面的例子, 在python中,方括号用于subscript: dict["a"]的值就是1,dict["b"]的值就是2
在perl中,花括号用于subscript: $hash{"a"}的值就是1,$hash{"b"}的值就是2

要删除一个元素,python用del,perl用delete

python和perl都有叫做"List"的类型,但是它们的含意不同.python的List相当于perl的数组;perl的List相当于python的tuple. 不过,它们的特性还是有很大的不同的.
python的List用方括号'[]'来赋值;而perl的数组和它的hash一样,也是用括号,不过变量前要用'@'而不是'%'
python
>>> li = ['a', 'b', 'mpilgrim', 'z', 'example']
>>> li[-1]
'example'
>>> li[-3]
'mpilgrim'

perl
@fred = qw(hello dolly);

python的数组(List)和它的字典一样,也是用方括号来引用元素;而perl和它的hash不同,hash用花括号,数组则也和python的一样,用方括号.

python的数组(List)和perl的数组的一个相同之处是,它们都支持用负数的下标来引用元素.-1的下标表示最后一个元素,-2表示倒数第2个,依此类推.
不同的地方是,pythons可以用slice在指定一个范围内的元素,如 li[1:3];perl则无法指定一个范围内的元素

要向数组(List)里添加元素,python要使用append,insert和extend函数;而perl只要直接向数组元素赋值即可

python的List可以用remove,pop来删除一个元素.删除一个元素之后,剩下的元素的下标也相应改变;而perl则有pop,push,shift,unshift等来操作数组

python的tuple和perl的List差不多.它们都是不可修改的.准确来说,因为perl的List只有保存在数组或hash里才可进行操作,所以每次出现的List都是不同东西.

python的tuple用'()'来定义,和perl的List是一样的.不过,python的tuple和python的List相比,除了在不可修改这点不同以外,其他都是一样的:tuple也可以用[]来引用其中的元素;而perl的List是无法取出其中的元素的.只有存在hash或数组类型的变量里的List才能引用其中的元素.

tuple可以用在格式化字符串上,例如:
>>> k = "uid"
>>> v = "sa"
>>> "%s=%s" % (k, v)
'uid=sa'

在perl中,要使用sprintf来得到格式化字符串
$ perl
@a = (1,2);
$str = sprintf "%d, %d", @a;
print $str;
1, 2


从上面可以总结出,python通过定义变量时用的括号类型(花括号,方括号,圆括号)来区分字典,List和tuple类型;而perl通过在变量前的特殊字符(%或@)来区分hash和数组

python的Mapping List和perl的map函数的功能差不多:
python
$a = [ 1, 2, 3, 4 ]
$[ elem*2 for elem in a ]
[2, 4, 6, 8]

perl
$ perl
@a = ( 1, 2, 3, 4 );
print map $_*2, @a;
print map { $_*($_-1) } @a;
246802612

python的Mapping List直接返回一个新的List,而perl的map的返回值是一个新的数组
更大的不同是,python的Mapping List可以指定用于计算的变量(例如上面的elem),而perl的map只能使用$_;
python的Mapping List可以用在字典上,而perl的map似乎只能用于数组
$[ "%s=%s" % (k, v) for k, v in dict.items() ]
['a=1', 'c=3', 'b=2']


上例中用到的items()函数相当于perl的each. 其他如keys和values,python和perl的是一样的.

python的Filtering List功能则和perl的grep函数差不多
python
>>> list = [ 1,2,3,4,5,6 ]
>>> [ elem*2 for elem in list if elem % 2 == 0 ]
[4, 8, 12]

perl
$ perl
@a = qw/ 1 2 3 4 5 6 /;
@b = map $_*2, grep { $_ % 2 == 0 } @a;
print "@b";


另外,python的filtering list和perl的expression modifier也有点相似
$ perl
@a = qw/ 1 2 3 4 5 6 /;
foreach ( @a )
{
printf "%d*2 = %d\n", $_, $_*2 if $_ % 2 == 0;
}
2*2 = 4
4*2 = 8
6*2 = 12

perl的expression modifier每次只能使用一个,即不能够同时使用if,unless等;而python可以同时使用for和if

python的字符串有join和split两个函数用于分割和合并字符串,perl中也有这两个函数
python
$"$$".join([ "%s=%s" % (k, v) for k, v in dict.items() ])
'a=1$$c=3$$b=2'

$str = "$$".join([ "%s=%s" % (k, v) for k, v in dict.items() ])
$str.split("$$")
['a=1', 'c=3', 'b=2']

perl
$ cat perl.test
#!/bin/perl -w
@a=( "1", "2", "3", "4");
$str= join ";", @a;
print "$str\n";
@str2 = split /;/, $str;
print "@str2\n";

$ perl -f perl.test
1;2;3;4
1 2 3 4

perl的split比python的更强大,因为它的分隔符可以是正则表达式






转载请注明出处 http://fornote.blogspot.com

没有评论:

发表评论