如何检查awk变量的类型?

时间:2017-10-10 09:08:52

标签: variables awk gnu gawk

http://www.skeeve.com/gawk/gawk-4.1.65.tar.gz中提供的gawk 4.2.0的Beta版本是的主要版本,具有许多重要的新功能

我之前询问过What is the behaviour of FS = " " in GNU Awk 4.2?,现在我注意到全新的typeof()功能要弃用isarray()

  

从4.1.4变为4.2.0

     
      
  1. 新的typeof()函数可用于指示变量或数组元素是否为数组,正则表达式,字符串或数字。不推荐isarray()函数支持typeof()
  2.   

我可以涵盖四种情况:字符串,数字,数组和未分配:

$ awk 'BEGIN {print typeof("a")}'
string
$ awk 'BEGIN {print typeof(1)}'
number
$ awk 'BEGIN {print typeof(a[1])}'
unassigned
$ awk 'BEGIN {a[1]=1; print typeof(a)}'
array

然而,我很难得到" regexp"因为我没有尝试达到这一点并总是产生"数字":

$ awk 'BEGIN {print typeof(/a/)}'
number
$ awk 'BEGIN {print typeof(/a*/)}'
number
$ awk 'BEGIN {print typeof(/a*d/)}'
number
$ awk 'BEGIN {print typeof(!/a*d/)}'
number
$ awk -v var="/a/" 'BEGIN{print typeof(var)}'
string
$ awk -v var=/a/ 'BEGIN{print typeof(var)}'
string

如何将变量定义为" regexp"?

我注意到了之前的一颗子弹:

  
      
  1. Gawk现在支持强类型的regexp常量。这些常量看起来像@ / ... /。您可以将它们分配给变量,将它们传递给函数,在〜,!〜和switch语句的case部分中使用它们。手册中提供了更多详细信息。
  2.   

尝试了一下,但没有运气:

$ awk -v pat=@/a/ '{print typeof(pat)}' <<< "bla ble"
string

1 个答案:

答案 0 :(得分:2)

typeof(/a/)正在运行typeof() $0 ~ /a/的结果,这是一个数字。我自己还没试过这个,但我希望这是你想要的:

typeof(@/a/)

var = @/a/
typeof(var)

这样可行:

$ awk 'BEGIN {print typeof(@/a/)}'
regexp

$ awk 'BEGIN {var=@/a/; print typeof(var)}'
regexp