[转载]利用Perl切片从列表数据中提取关键字段

我们通常中关注列表当中的某几个单元. 例如, 从一个联系人记录中提取姓名和电话号码,假如每一条记录的格式都是由","分隔的:
姓名,性别,地址,邮编,电话号码
我们需要提取第一个和第五个字段
可以如此做:
while(<FILE>){
chomp;
my @items = split /,/;
my($name, $num)=($items[0], $items[4]);
... #继续其他操作
}
但这样有些浪费,因为@items就相当于是一个临时列表,我们可以进一少改善, 引入列表:
my($name, $num)=(split /,/)[0,4];
这样一次切片便成功地对两个标量进行了赋值.
切片通常是从列表中读取少量值的最简单办法, 这里我们可以从列表中拉出第一个和最后一个值,借助下标-1代表最后一个元素的便利:
my($name, $num)=(split /,/)[0,-1];
另外对列表排序,并取出最小值与最大值:
my($first, $last) = (sort @names)[0, -1];
切片的下标顺序可以是任意的, 也可以重复.
my @names = qw{zero one two three four five six seven eight nine};
my @numbers = (@names)[2, 0, 6, 0, 4];
print "Numbers: @numbersn"; #打印: Numbers: two zero six zero four
对于数组切片,圆括号不是必需的, 所以前面的例子可以进一步简化:
my @numbers = @names[2, 0, 6, 0, 4];
这里的@符号代表了一组数据,方括号意味着你要检索数据,@符号则意味着获取的是列表, 不像$符号意味着获取单个元素.
所以@names[0,4]与 ($names[0], $names[4])是同样的含义.
我们还可以用切片对数组元素进行赋值:
@names[0,4] = ("Rockie", "123456");
也可以对哈希做切片操作, 与数组切片类似, 也是由@符号表示从列表中获取数据, 不同的是哈希是以花括号{}来进行检索数据的.
my %scores = (a => 90, b => 100, c=> 80);
my @theirScores = @scores{qw/a, b, c/};
同时我们还可以对哈希进行赋值操作:
@scores{qw/a, b, c/}=(100, 90, 80);

发表评论

邮箱地址不会被公开。 必填项已用*标注