zoukankan      html  css  js  c++  java
  • Perl与JS的比较(数组、哈希)

    上一篇列出了Perl中定义数组,对象的方式与JS的异同。这里继续补充数组,哈希的相关操作。

    一、数组

    可以对数组进行增删,插入。与JS不同的是这些函数都是全局的,JS则是挂在Array.prototype上。

    1,对数组尾部的操作pop(删除最后的元素)、push(在尾部添加)

    @goods = qw/pen pencil/;
    pop(@goods); # @goods 变成 (pen)
    push(@goods, 'brush'); # @goods 变为 (pen, brush)
    

    在Perl中,函数调用时小括号是可选的(视上下文而定),就象前面使用的print。以下是等价的

    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种方式获取

    @goods = qw/pen pencil/;
    
    # 将数组变量赋值给一个标量变量
    $len = @goods;
    
    # 使用scalar函数
    $len = scalar(@goods);
    
    # 最后一个元素的索引加1
    $len = $#goods + 1;
    

    7,遍历数组,Perl用foreach函数

    @goods = qw/pen pencil brush/;
    
    # 默认的$_
    foreach (@goods) {
      print "$_"."\n";
    }
    
    # 自定义变量
    foreach $item (@goods) {
      print "$item"."\n";
    }
    

    ES5可以用forEach

    ['pen', 'pencil', 'brush'].forEach(function(item) {
        console.log(item)
    })

    二、哈希

    1,获取keys和values

    %person = (
      name => 'Jack',
      age  => 30,
    );
    @k = keys %person; # (name, age)
    @v = values $person; # ('Jack', 30)
    

    ES5有Object.keys,但没有Object.values

    person = {
      name: 'Jack',
      age: 30
    }
    Object.keys(person) // ['name', 'age']

    2,获取键值对(key-value)数量(对Perl来说很容易)

    %person = (
      name => 'Jack',
      age  => 30,
    );
    $len = keys %person; # 2
    

    对于JS来说,可能需要for in整个对象

    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。

    %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函数

    %person = (
      name => 'Jack',
      age  => 30,
    );
    if (exists $person{ndame}) {
      print 'yes';
    } else {
      print 'no';
    }
    

    JS用in运算符。

    5,删除key,都用delete,但Perl是函数,JS是运算符

    %person = (
      name => 'Jack',
      age  => 30,
    );
    delete $person{'name'}; 
    

    三、数组与哈希互换

    Perl里哈希很容易就被转成数组

    %person = (
      name => 'Jack',
      age  => 30,
    );
    @arr = %person; # 将哈希转成数组 变成了('name', 'Jack', 'age', 30)
    

    数组转成哈希

    @nums = qw/zero 0 one 1 two 2/;
    %hash = @nums;
    while( ($k, $v) = each %hash ) {
      print "$k: $v\n";
    }
    

    打印如下

    以上互换JS里没有原生支持,需自行实现。

  • 相关阅读:
    107. Binary Tree Level Order Traversal II
    103. Binary Tree Zigzag Level Order Traversal
    102. Binary Tree Level Order Traversal
    690. Employee Importance
    1723. Find Minimum Time to Finish All Jobs
    LeetCode 329 矩阵中最长增长路径
    7.2 物理内存管理
    LeetCode 面试题 特定深度节点链表
    LeetCode 100 相同的树
    npm安装包命令详解,dependencies与devDependencies实际区别
  • 原文地址:https://www.cnblogs.com/snandy/p/2751336.html
Copyright © 2011-2022 走看看