请问用perl如何处理这种特殊格式的文档



[Copy to clipboard] [ - ]
CODE:
while(<DATA>){
    chomp;
    print;
    /\S/ and print scalar <DATA>;
}

谢谢!这么做实践证明是可行的。
关键是/\S/ and print scalar <DATA>;,我不理解。
/\S/匹配的是非空格字符串,在我的例子中也就是匹配各个变量的值,那么后边的scalar是强迫语句位于标量环境,为什么scalar是对<DATA>操作,而不是对"$_"操作呢?这一句的作用很不解。

还有,最后能生成期望的格式:

[Copy to clipboard] [ - ]
CODE:
v1  v2  v3  v4  v5  v6   v7    v8
1    2   3     4    5  6     7    8
1.1 2   3.2  11   6  s     f    9
.

那么,各行之间的回车符又是从哪里来的?

望不吝赐教。


QUOTE:
原帖由 hjp0021 于 2008-9-25 11:37 发表
while(){
    chomp;
    print;
    /\S/ and print scalar ;
}

谢谢!这么做实践证明是可行的。
关键是/\S/ and print scalar ;,我不理解。
/\S/匹配的是非空格字符串,在我的例子中也就是匹配各个 ...

这个伪函数可以用于 LIST 里,当在列表环境中计算会生成一个不同的结果的时候,强迫 EXPR 在标量环境中计算。比如:
   my ($nextvar) = scalar <STDIN>;
避免 <STDIN> 在做赋值之前从标准输入把所有的行都读了进来,因为给一个列表(甚至是一个 my 列表)赋值都会产生一个列表环境。(在这里例子里如果没有 scalar,那么来自 <STDIN> 的第一行仍然会赋予 $nextvar,但是随后的行将会被读取并抛弃,因为我们赋值的目标列表只能接受一个标量数值。)
...
因为 print 函数是一个 LIST 操作符...
谢谢楼上各位!我再好好琢磨琢磨。
$ cat urfile
v1  v2  v3  v4  v5
  v6   v7    v8
1   2   3    4      5
  6     7    8

1.1 2   3.2  11   6
  s     f     9

3    4    6    9     4
  0    2     6
$ xargs -n8 < urfile
v1 v2 v3 v4 v5 v6 v7 v8
1 2 3 4 5 6 7 8
1.1 2 3.2 11 6 s f 9
3 4 6 9 4 0 2 6