arrays - 如何检查变量是否为数组?

标签 arrays variables awk gawk variable-types

我正在玩 PROCINFO 及其 sorted_in 索引,以便能够 control the array transversal .

然后我想知道PROCINFO的内容是什么,所以我决定通过它并打印它的值:

$ awk 'BEGIN {for (i in PROCINFO) print i, PROCINFO[i]}'
ppid 7571
pgrpid 14581
api_major 1
api_minor 1
group1 545
gid 545
group2 1000
egid 545
group3 10004
awk: cmd. line:1: fatal: attempt to use array `PROCINFO["identifiers"]' in a scalar context

如您所见,它中断是因为 - 至少 - 一项它本身也是一个数组。

快速的解决方法是跳过这个:
awk 'BEGIN {for (i in PROCINFO) {if (i!="identifiers") {print i, PROCINFO[i]}}}'

但是它看起来有点hacky并且想要像
awk 'BEGIN {for (i in PROCINFO) {if (!(a[i] is array)) {print i, PROCINFO[i]}}}'
                                     ^^^^^^^^^^^^^^^^

因为没有像 type() 这样的东西函数来确定一个变量是一个数组还是一个标量,我想知道:有没有办法检查一个元素是否是一个数组?

我在想一些事情,比如用 for 经历它。并捕获可能的错误,但我不知道如何。
$ awk 'BEGIN{a[1]=1; for (i in a) print i}'
1
$ awk 'BEGIN{a=1; for (i in a) print i}'
awk: cmd. line:1: fatal: attempt to use scalar `a' as an array
$ awk 'BEGIN{a[1]=1; print a}'
awk: cmd. line:1: fatal: attempt to use array `a' in a scalar context

最佳答案

在 GNU Awk 中,有一个答案,但推荐的方法取决于您运行的版本。

从 2017 年 10 月发布的 GNU Awk 4.2 开始,有一个新功能 typeof() 检查这一点,如 release notes 中所示来自测试版:

  1. The new typeof() function can be used to indicate if a variable or array element is an array, regexp, string or number. The isarray() function is deprecated in favor of typeof().

所以现在你可以说:
$ awk 'BEGIN { a[1] = "a"; print typeof(a) }'
array
并执行如下检查:
$ awk 'BEGIN { a = "a"; if (typeof(a) == "array") print "yes" }'    
$ awk 'BEGIN { a[1] = "a"; if (typeof(a) == "array") print "yes" }'
yes

在旧版本中,您可以使用 isarray() :
$ awk 'BEGIN { a = "a"; if (isarray(a)) print "yes" }'
$ awk 'BEGIN { a[1] = "a"; if (isarray(a)) print "yes" }'
yes
从手册页:
isarray(x)
    Return true if x is an array, false otherwise.

关于arrays - 如何检查变量是否为数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34414028/

相关文章:

python - 如何将 .predict(x) 方法结果中的元素与另一个数组中的元素进行匹配并输出?

javascript - 向对象数组添加新属性(根据现有属性值分配特定值)

javascript - 如何在 jquery 中传递函数变量?

javascript - 坚持在简单的 javascript 程序中使用变量

mysql - 使用变量对MySQL表进行排序

javascript - 如何在 Javascript 中创建二维数组

variables - 如何检查 awk 变量的类型?

linux - Grep csv 与来自另一个 csv 的参数

sed - 文件中的 DOS 到 UNIX 路径替换

javascript - 测试 Date 对象的升序 Javascript 数组