Perl与JS的比较(数组、哈希)
上一篇列出了Perl中定义数组,对象的方式与JS的异同。这里继续补充数组,哈希的相关操作。
一、数组
可以对数组进行增删,插入。与JS不同的是这些函数都是全局的,JS则是挂在Array.prototype上。
1,对数组尾部的操作pop(删除最后的元素)、push(在尾部添加)
1 2 3 | @goods = qw/pen pencil/ ; pop ( @goods ); # @goods 变成 (pen) push ( @goods , 'brush' ); # @goods 变为 (pen, brush) |
在Perl中,函数调用时小括号是可选的(视上下文而定),就象前面使用的print。以下是等价的
1 2 | pop @goods ; # @goods 变成 pen push @goods , 'brush' ; # @goods 变为 (pen, brush) |
2,对数组首部的操作shift(删除第一个元素)、unshift(在首部添加元素)
3,任意位置删除或插入splice
4,逆序数组,Perl有reverse函数,JS没有对应函数。
5,排序数组sort,Perl和JS都有。
2,3,4,5提到的函数不贴演示代码了。
6,JS使用length属性获取数组长度,Perl不同,有3种方式获取
1 2 3 4 5 6 7 8 9 10 | @goods = qw/pen pencil/ ; # 将数组变量赋值给一个标量变量 $len = @goods ; # 使用scalar函数 $len = scalar ( @goods ); # 最后一个元素的索引加1 $len = $#goods + 1; |
7,遍历数组,Perl用foreach函数
1 2 3 4 5 6 7 8 9 10 11 | @goods = qw/pen pencil brush/ ; # 默认的$_ foreach ( @goods ) { print "$_" . "\n" ; } # 自定义变量 foreach $item ( @goods ) { print "$item" . "\n" ; } |
ES5可以用forEach
1 2 3 | [ 'pen' , 'pencil' , 'brush' ].forEach( function (item) { console.log(item) }) |
二、哈希
1,获取keys和values
1 2 3 4 5 6 | %person = ( name => 'Jack' , age => 30, ); @k = keys %person ; # (name, age) @v = values $person ; # ('Jack', 30) |
ES5有Object.keys,但没有Object.values
1 2 3 4 5 | person = { name: 'Jack' , age: 30 } Object.keys(person) // ['name', 'age'] |
2,获取键值对(key-value)数量(对Perl来说很容易)
1 2 3 4 5 | %person = ( name => 'Jack' , age => 30, ); $len = keys %person ; # 2 |
对于JS来说,可能需要for in整个对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | function getObjLen(obj) { var len = 0 for ( var a in obj) { if (obj.hasOwnProperty(a)) len++ } return len } var person = { name: 'Jack' , age: 30 } getObjLen(person) // 2 |
3,遍历对象
Perl有两种方式,一种while+each,一种获取keys再foreach。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | %person = ( name => 'Jack' , age => 30, ); # 方式1 while ( ( $k , $v ) = each %person ) { print "$k: $v" . "\n" ; } # 方式2 @keys = keys %person ; foreach ( @keys ) { print "$_: " . $person { $_ }. "\n" ; } |
JS一个for in即可。
4,判断某个key是否存在,Perl用exists函数
1 2 3 4 5 6 7 8 9 | %person = ( name => 'Jack' , age => 30, ); if ( exists $person {ndame}) { print 'yes' ; } else { print 'no' ; } |
JS用in运算符。
5,删除key,都用delete,但Perl是函数,JS是运算符
1 2 3 4 5 | %person = ( name => 'Jack' , age => 30, ); delete $person { 'name' }; |
三、数组与哈希互换
Perl里哈希很容易就被转成数组
1 2 3 4 5 | %person = ( name => 'Jack' , age => 30, ); @arr = %person ; # 将哈希转成数组 变成了('name', 'Jack', 'age', 30) |
数组转成哈希
1 2 3 4 5 | @nums = qw/zero 0 one 1 two 2/ ; %hash = @nums ; while ( ( $k , $v ) = each %hash ) { print "$k: $v\n" ; } |
打印如下
以上互换JS里没有原生支持,需自行实现。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端