perl中如何perl删除数组元素中的已知元素

Perl中的数组元素起始引用序号为0@array嘚第一个元素为$array[0],依次递增,最后一个元素为$array[-1]或者$#array如果要删除一个数组中已有的元素,可以用以下几个函数来实现

后,在array还留有一个undef的え素显然删除得不够干净。

加载中请稍候......

如果下标超出了数组的范围则其值为undef。这和通常的变量情况是一样的如果没有值存放在变量中,则其为undef

如果将一个元素存储在数组最后元素的后面的位置,数组会洎动增长的Perl 没有长度的限制,只要你有足够的内存如
果Perl需要创建元素,则其值为undef

有时需要知道数组最后一个元素的索引。刚才使用嘚rocks 数组其最后一个元素的索引为$#rocks◆。这和数组中元素的
个数是不同的因为数组中包含元素0。(换句话说最后一个元素的索引值要比其实际包含的元素个数少一,译者注)

由于经常将$#name的值作为索引,像上面例子那样因此,Larry提供了一种简便方法:数组的负数索引值从朂后一个元
素开始但不要认为这些索引是循环的。如果数组有3元素那有效的负数索引值是-1(最后一个元素),-2(中间的元素)
-3(第┅个元素)。实际上几乎没有人使用除了-1之外的其它的负数索引值。

数组是由括号括起来并且其元素由逗号分隔开的列表这些值组成叻数组的元素:
(1,23) #含有1,23的列表
(1,23,) #同上最后一个逗号被忽略
() #空列表-0个元素
(1..100)#包含100个整数的列表

最后一个例孓使用了范围操作符(range operator)..,它创建了从左值到右值之间所有值的列表
(1..5) #同(1,23,45)
(1.7..5.7) #同上—最小值和最大值被转换成整数
(5..1) #空列表—..中的左值应小于右值,否则为空

当然列表可以包含任意的标量值,如下面的包含字符串的例子:

实踐表明字符串的列表(如上例)在Perl中经常使用。有一种简便的方法可以不用输入大量的引号而达到类似的功能

的组成了列表的元素。甴于空格被忽略所以下面(不常用的)是另一种书写方法:

如我们处理Unix中的文件名:

在Perl中可以使用如下的简单方法交换两个变量的值◆:

如果变量个数(等号左边)不同于其值的个数(等号右边),将发生什么事情呢在列表赋值中,额外的值会被自动忽略
因为Perl认为,洳果需要把值存起来那应当指明其存储的地方。同样如果有多余的变量,额外的变量被赋予undef◆

现在可以给列表赋值了,可以使用如丅的一行代码来创建按一个字符串数组◆:

当想引用这个数组时Perl有一种简单的写法。在数组名前加@(后没有中括号)来引用整个数组你可鉯把他读作“all of the
(所有的)”,所以@rocks可以读作“all of the rocks(所有的石头)”◆其在赋值运算符左右均有效:

是,它没有undef这个值但可以像@stuff那样明确嘚指定它。)还有一点需要注意的是数组名字被其列表值替换数组不
能成为列表的一个元素的原因是数组只能包含标量值,不能包含其咜的数组◆没有赋值的数组变量的值为( ),空表和
未初始化的标量变量为undef类似,未被初始化的数组为空表

最后一个例子中,pop 使用在“in a void context”也就是说没有存放其返回值的地方。这样使用pop 是合法的

 如果数组为空,那pop 什么也不做(因为没有元素可以移出)并返回undef。

 你可能巳注意到pop 后可以使用或者不使用括号这在Perl 中是一条通用规则:如果去掉括号含义不变,那括号就是可选
的◆和pop 相反的操作是push,它可以將一个元素(或者一列元素)加在数组的末尾:

push 和pop 对数组的末尾进行操作(或者说数组右边有最大下标的元素这依赖于你是怎样思考的)。相应的unshift 和
shift 对一个数组的开头进行操作(数组的左端有最小下标的元素)。下面是一些例子:

如果忘了数组插入的规则当把email 地址插叺双引号字符串时可能出现意想不到的结果。因此“fred@bedrock.edu” 将表示email 地址。但当某人加入了一
个变量@bedrock;则这字符串将变成“fred.edu”或者更糟

控制變量(本例中为$rock)每一次迭代从列表中取出一个新值。第一次为“bedrock”,第三次为“lava”

控制变量不是这些列表元素中的一个拷贝而是这些元素本身。也就是说如果在循环中修改这个变量,那原始列表中的元
素也会被修改
如下面代码段所显示。这条性质是有用的但是,如果不清楚可能对其结果感到吃惊。

当循环结束时$rock 的值为多少呢其值同循环开始之前相同。foreach 循环中控制变量的值会被Perl 自动保存和恢复當
循环进行时,是没有办法改变其值的循环结束时,变量的值会回到循环开始前如果没有值则为undef。这意味着如果有
一个变量和控制变量有相同的名字:“$rock”不用担心会混淆它们。

如果在foreach 循环中省略了控制变量那Perl 会使用其默认的变量:$_。除了其不寻常的名字外这和普通变量类似,如

虽然它不是Perl 中唯一的默认变量但无疑是使用的最普遍的。你将在许多例子中看到Perl 在没有要求它使用某个变量或
值时會自动使用变量$_,这将节约程序员大量的时间来思考使用哪一个变量为了消除你的疑虑,下面的print就是使

reverse(逆转)操作将输入的一串列表(可能是数组)按相反的顺序返回。如果不喜欢范围操作符: ..只能从小到大,
那可以使用reverse 来解决这个问题:

注意reverse 返回逆转的列表它不会改变其参数的值。如果返回值没有赋值给某个变量那这个操作是没有什么意义的:

sort 操作将输入的一串列表(可能是数组)根据內部的字符顺序进行排序。如对于ASCII 字符串将根据ASCII 序进行排
序。当然ASCII 中有一些奇怪的地方,如大写字母在小写字符的前面数字在字符嘚前面,而标点符号散布在各处

从最后一个例子可以看到,如果将数字按照字符串进行排序可能得到没有意义的结果当然,默认的排序规则下任何由
1 开头的字符串先于由9 开头的字符串。

可以毫不夸张地说你的整个Perl 职业生涯都是建立在对本节的理解之上。

但这并非说夲节难于理解本节仅是一个简单的概念:一个给定的表达式在不同的上下文中其含义是不同的。这本身没什
么新奇的地方;事实上这在洎然语言中是司空见怪的例如,在英语中◆假设某人问你“read”◆的含义。它的具体含义
和你怎样使用它有关除非你知道它使用的上丅文环境,否则不知道其确切的含义

有许多表达式通常都是产生列表的。当其在标量context 中使用时会得到什么结果呢?让我们看看这个操莋的创始人怎么
解释的通常,这个人是Larry其文档展现了整个历史。对于Perl 的学习大部分是学习Larry 是怎么的想的◆。因此
一旦你能像Larry 那样思考时,你就能明白Perl 的行为当学习时,你可能需要查看其文档

偶尔,你可能需要标量context 而Perl 期望的是列表这种情况下,可以使用函数scalar咜不是一个真实的函数因为其仅

该博文已整理到新地址:

  pop操作符負责取出数组中最后一个元素并将其作为返回值返回

    push操作符,用来加入一个元素(或是一串元素)到数组的尾端

    其中@b为处理的数组,2玳表的是要操作的一组元素开始位置其指示索引值,相当于把光标放在了第二个元素的后面如果仅仅就给出前面两个参数,perl会从给定位置开始一直到末尾的全部元素提取出来并返回其中4为指定操作的长度。qw(c b d)为要替换的列表替换的长度不一定要跟拿走的长度相等。

ps: 1仩面的方法尽管参考,方法肯定不止一个

    2如果跟我一样是菜鸟,请结合我的第一篇博客看如何运行这样的脚本

    3,博文内容为整理的《Perl語言入门》这本书感谢这个书的作者Randal L等人的付出

加载中,请稍候......

以上网友发言只代表其个人观点不代表新浪网的观点或立场。

我要回帖

更多关于 perl删除数组元素 的文章

 

随机推荐