拆分perl中的管道字符

sau*_*dic 8 perl awk split

我有一点问题.我想在使用拆分运算符找到的每个管道字符处拆分一条线.就像在这个例子中.

echo "000001d17757274585d28f3e405e75ed|||||||||||1||||||||||||||||||||||||" | \
perl -ane '$data = $_ ; chop $data ; @d = split(/\|/ , $data) ; print $#d+1,"\n" ;'
Run Code Online (Sandbox Code Playgroud)

我希望36的输出awk与分隔符|返回36 分开,但是我得到12,好像分裂停1在了行中的字符处.

echo "000001d17757274585d28f3e405e75ed|||||||||||1|||||||||||||||||||||||||||||||||||||||" | \ 
awk -F"|" '{print NF}'
Run Code Online (Sandbox Code Playgroud)

任何的想法.我尝试过多种方式引用|,但没有成功.非常感谢提前.

Mat*_*Mat 16

根据split:

默认情况下,将保留空的前导字段,并删除空的尾随字段.

您需要为拆分指定负限制以获得尾随的限制:

split(/\|/, $data, -1)
Run Code Online (Sandbox Code Playgroud)

  • +1 - 大多数人在遇到这种情况之前都没有意识到这一点,他们会检查.以编程方式,它没有任何区别.如果我想测试一个值是否被定义`if(定义$ my_array [$ field])`将起作用是否实际上有一个条目`$ my_array [$ field]`其值未定义或者是否没有定义的字段`$ my_array [$场]`. (2认同)
  • "以编程方式",存在巨大差异.例如`for(@myarray)`,`join($ sep,@ myarray)`等 (2认同)