<Perl语言入门>读书笔记 | 三. 列表和数据

1. 数组

本质就是数组,几个比较有意思的地方:

  1. 数组名可以和变量名相同,Perl数组的名字空间和变量的名字空间是完全分开的;
  2. 数组下标越界时,对应的值是undef;
  3. 如果对索引值超过数组尾端元素进行赋值,比如 $a[99] = ‘vivi’,则会自动将数组扩展到99,增补的元素默认取值undef;
  4. 支持负数数组索引值,如 $a[-1];
  5. $#a代表数组a的大小。
@array = undef;     # 得到一个仅有一个元素undef的列表,undef是标量
@array = ();        # 清空数组

2. 列表

类似Python的List,一些典型的例子:

print (1, 2, 3);
print (1, 2, 3,);       # 同(1,2,3),末尾的逗号会被忽略
print ("vivi", 4.5);    # 两个元素,vivi和4.5
print ();               # 空列表
print (1..5);           # 同(1,2,3,4,5),..是范围操作符
print (1.7...5.7);      # 同(1,2,3,4,5),小数被向下取整
print (5..1);           # 同(),..只能向上计数

qw操作符(quoted word):可以建立单词列表。所有的空白符(如空格、制表符、换行符)都会被视为单词间的间隔符。定界符()或{}是可以选的,只要配对就行。

print qw(a b c d e)     # 同qw{a b c d e}

列表赋值:@操作可以引用整个数组。

print qw(a b c d e);    # 同qw{a b c d e}
($a[0],$a[1],$a[2]) = qw(a b c);
@a = qw(a b c);
@b = @a;                # 复制数组的元素到另一个数组

3. 数组操作函数

push和pop

@array = 5..9;
$fred = pop(@array);    # fred变成9,数组变成(5,6,7,8)
pop @array;             # 数组变成(5,6,7)

push @array, $fred;     # 数组变成(5,6,7,9)

shift和unshift

类似push和pop,只是操作位置改为了数组开头。

@array = qw{dino fred barney};
$m = shift @array;     # ('fred','barney')
unshift @array, 4;      # (4,'fred','barney')

splice操作符

@array = qw{a b c d e};
@removed = splice @array, 2;    
print @array,"\n";          # (a,b)
print @removed,"\n";        # (c,d,e)

@array = qw{a b c d e};
@removed = splice @array, 2, 2; 
print @array,"\n";          # (a,b,e)
print @removed,"\n";        # (c,d), 2表示长度

@array = qw{a b c d e};
@removed = splice @array, 2, 2, qw(x y);    
print @array,"\n";          # (a,b,x,y,e), 将qw(x y)替换进指定位置
print @removed,"\n";        # (c,d),2表示长度

字符串中内插数组

@rocks = qw{ b c d };
print "a@rocks e";      # ab c d e
print "a @rocks e";     # a b c d e

@fred = qw(a b c);
$fred = "right";
print "this is $fred[2]\n";        # this is c
print "this is ${fred}[2]\n";  # this is right[2]

foreach控制结构

$rock = 'shale';
@rocks = qw{bedrock slate lava};

foreach $rock (@rocks){
    $rock .= "a\t";    # 在末尾加上a\t
}
print @rocks;       # bedrocka  slatea  lavaa, 列表被改变了   
print $rock;		# shale, 控制变量$rocks循环结束会还原

没有指定控制变量$rocks时,可以使用默认的控制变量:$_。

reverse操作符

@array = 1..5;
@new = reverse @array;
print @array;       # 12345
print @new;         # 54321

sort操作符

@array = 97..102;
@new = sort @array;
print @array, "\n";     # 97 98 99 100 101 102
print @new, "\n";       # 100 101 102 97 98 99

each操作符

@rocks = qw{a b c d e};
while(($index, $value) = each @rocks){
    print "$index: $value\n";
}

0: a
1: b
2: c
3: d
4: e
[Finished in 0.1s]

类似于Python里的enumerate:

rocks = ['a', 'b', 'c', 'd', 'e']
for index, value in enumerate(rocks):
    print index, ":", value

4. 标量上下文与列表上下文

看到这一部分内容感觉很不适应,好像从来没有一门编程语言如此强调所谓的上下文环境。书里特别强调了,这节是理解Perl的重中之重。所谓上下文,指的是你如何使用表达表。即同一个表达式,在不同的上下文中,会表现出不同的意义。比如:

@people = qw{fred barney betty};
@sorted = sort @people;     # 列表上下文:barney, betty, fred
$number = 42 + @people;     # 标量上下文:42+3,得45

根据不同的上下文环境,@people表现出了不同的内容。这种特性,哪怕是在Python里都是不允许的。看到这里发现Perl比Python还要飘逸。这无形中加重了程序员的负担。比如,上面这个例子,Python解释器会认为是语法错误,而提示程序员去修改代码。但是在Perl中,这种语法是合理的,这意味着程序员必须很了解在不同的上下文环境中,一个表达式会表现出什么含义。对于资深Perl程序员而言,这可能可以使代码更加简洁。但是却提高了外行Perl程序员的阅读难度。欢迎资深Perl程序员来为Perl的这个特性洗白。

通过关键字scalar可以强制指定后面这个表达式为标量上下文:

@rocks = qw{a b c d};
print "I have ", @rocks, " rocks!\n";
print "I have ", scalar @rocks, " rocks!\n";

批量读入行:

chomp(@lines = <STDIN>);
print @lines;

程序不断从标准输入读入数据,直至通过Ctrl+D(Unix)或Ctrl+Z(Windows)来发送文件结尾标记。

5. 课后习题

(1)

print reverse (@lines = <STDIN>);

print reverse <STDIN>;

(2)

@names = qw{fred betty barney dino wilma pebbles bamm-bamm};
chomp(@lines = <STDIN>);
foreach (@lines){
    print @names[$_-1], "\t";
}

(3)

chomp(@lines = <STDIN>);
foreach (sort @lines){
    print $_, "\t";
}

chomp(@lines = <STDIN>);
@sorted = sort @lines;
print "@sorted\t";

参考文献

  1. Perl语言入门 第六版中文清晰PDF

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值