去掉空行

呵呵,不是数数,我刚刚在学perl
我是想每次读文本中的一行,成为当前运行脚本的A B C等等个变量(以空格分开)去掉空行

shell里面是while read  ,想直接用perl写出来。
现在也没做出来,不知道各位大哥能否赐教一下。呵呵,我还不行


QUOTE:
原帖由 perljoker 于 2007-9-19 12:21 发表
我澄清一下,我所说的学习是指我看到原来\s+这种写法可以匹配只有\n的空行
因为我原来写的就是\s*还需要再写个\n,所以,我说我学了
回复 #8 Lonki 的帖子
对于\s+无法匹配""的情况,我是觉得这里说的是文件 ...

恩,  在文件中确实是没有问题的.


其实我想说的是下面的内容:
对于^\s*$
通常, 我们让\s*去匹配"空字符", 让$去"匹配"\n(注:和普通的匹配不同). 由于Perl的正则默认采用贪婪匹配, 所以在Perl中这个模式其实应该写成^\s*?$

而你用的^\s+$
必然会让\s匹配到\n


另外我们来比较2句关于\n和$的匹配, 希望对你有帮助.
if ("abc\n" =~ /^abc$/) {
    print "Oh yes\n";
}


if ("abc\n" =~ /^abc\n$/) {
    print "Oh yes, too\n";
}




QUOTE:
原帖由 lzd7807 于 2007-9-19 15:15 发表
呵呵,不是数数,我刚刚在学perl
我是想每次读文本中的一行,成为当前运行脚本的A B C等等个变量(以空格分开)去掉空行

shell里面是while read  ,想直接用perl写出来。
现在也没做出来,不知道各位大哥能 ...

把你之前的if (..) { ... } 改成

next if ($_ =~ /^\s*$/);

即可跳过空行


QUOTE:
原帖由 Lonki 于 2007-9-19 16:03 发表



恩,  在文件中确实是没有问题的.


其实我想说的是下面的内容:
对于^\s*$
通常, 我们让\s*去匹配"空字符", 让$去"匹配"\n(注:和普通的匹配不同). 由于Perl的正则默认采用贪婪匹配, 所以在Perl中这个 ...

恩,我注意过$可以“匹配”\n,同时,他也可以作为一种特殊的纯句末断言
在上次看到\s+这种写法,我就做了很多测试了
原来我写\n$,后来发现这样没有必要,而且如果要进行行删改操作,\n是否匹配怕会给人疑惑
在这里,就是很明白的告诉别人,我是查找一切形式空行,并且,\s+将至少匹配\n
在文件中,若修改代码,去空行,直接s/^\s+$//g不是挺好,这就是我用\s+的理由
关键代码:

[Copy to clipboard] [ - ]
CODE:
while(<FN>){print if $_ !~ /^\s+$/;}

感觉Lonki兄在匹配这里理解的透彻些,如果我的写法会造成各种误解
还请指出,呵呵

不想多加一个回复了,直接添加这里
最后补充:/^\s*?$/g 和 /^\s+?$/g
对于只有\n的行,前者将匹配两次,后者匹配一次,其他基本等效,END



QUOTE:
原帖由 perljoker 于 2007-9-19 16:19 发表

恩,我注意过$可以“匹配”\n,同时,他也可以作为一种特殊的纯句末断言
在上次看到\s+这种写法,我就做了很多测试了
原来我写\n$,后来发现这样没有必要,而且如果要进行行删改操作,\n是否匹配怕会给人疑 ...

看来我们都明白了对方的心...


选择哪种用法, 或许和第一次接触\s的情形有莫大的关系(可见第一次是很重要的)

个人更倾向于把\s当\f\t用, 而不是\f\t\n\r
for example:
a  =  b
a = b
a=b
都能被\w+\s*=\w+\s*匹配, 这里\s*不正是代表了 空 和 空白 么.


互相学习, 啧啧...