【问题标题】:How to check if a variable is an array?如何检查变量是否为数组?
【发布时间】:2016-03-28 14:39:11
【问题描述】:

我正在使用 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

【问题讨论】:

    标签: arrays variables awk gawk variable-types


    【解决方案1】:

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


    从 2017 年 10 月发布的 GNU Awk 4.2 开始,有一个新函数 typeof() 可以检查这一点,如 beta 版本中的 release notes 所示:

    1. 新的 typeof() 函数可用于指示变量或数组元素是数组、正则表达式、字符串还是数字。 isarray() 函数已弃用,取而代之的是 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.
    

    【讨论】:

    • 真的是这样!手册中的 isarray() 用于两种情况。第一个是遍历多维数组时:你可以测试一个元素本身是否是一个数组。,正是我的情况!
    • 从 GNU awk 4.2 我们现在有了 typeof()!
    • 不错。我们将在typeof() 的链接进入 GNU awk 文档后立即添加它。
    猜你喜欢
    • 2011-02-26
    • 2015-02-25
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多