Chinaunix

标题: PERL中怎么删除一空行 [打印本页]

作者: HF.SKY000    时间: 2008-11-30 15:44
标题: PERL中怎么删除一空行
open(READ,"sz_ci.log"||die "Can not write!";       
                while (<READ> {
                chomp;
                @array=<READ>;
                                #print @array;  
                }
                close(READ);
                for (my $i=0;$i<@array ;$i++) {
                        print $array[$i],"\n";
                }

输出:11032

11932

12741

12761

12801
问题:在chomp;@array=<READ>;这之后输出发现没有空行.但是通过一个FOR循环之后输出却有空行了?怎样才能取掉空行呢?
作者: dl0622    时间: 2008-11-30 16:16
你不是打印了空行吗?
"\n";
问得太奇怪了
作者: HF.SKY000    时间: 2008-11-30 16:37
标题: 回复 #2 dl0622 的帖子
是空行,输出结果帖出来了.
作者: machine    时间: 2008-11-30 16:37
while (<READ> {
                chomp;
                @array=<READ>;
                                #print @array;  
                }
你这程序我不有点读不懂。
想去空行这样不就行了:

while (<READ> {
               s/^\s*$//g;
               print;  
                }
作者: HF.SKY000    时间: 2008-11-30 16:43
标题: 回复 #4 machine 的帖子
呵呵,通过FOR循环输出发现是有空行.
作者: ynchnluiti    时间: 2008-11-30 16:53
原帖由 HF.SKY000 于 2008-11-30 15:44 发表
open(READ,"sz_ci.log"||die "Can not write!";       
                while () {
                chomp;
                @array=;
                                #print @array;  
                }
                close(READ);
                for (my $i=0;$i

楼主没注意两个print的区别, 可能是for循环里写print语句加上,"\n";写习惯了。

@array=<READ>;
这句中<>在列表环境,会把文件内容从第二行到文件结尾一次读入@array;所以chomp只对第一行有效。
for循环里print $array[$i],"\n"; 中$array[$i]已经包含一个'\n'(没有被chomp), 再输出一个\n,就会多输出一个空行.
作者: ynchnluiti    时间: 2008-11-30 17:09
删除空行,
  1. open(READ,"sz_ci.log")||die "Can not write!";   
  2. while (<READ>) {
  3.     print if !/^$/;
  4. #  print if !/^\s*$/;#删除包含空格,tab的空白行
  5. }
  6. close(READ);
复制代码

作者: HF.SKY000    时间: 2008-11-30 17:29
标题: 回复 #6 ynchnluiti 的帖子
说得对,在FOR循环PRINT多带了一个"\N".
再请教个问题:

for (my $i=0;$i<@array ;$i++) {
my $s="select ne_id from ne_cell where n_confirm<>1 and ci=$array[$i] and city_id='114' order by 1";
$sth=$dbh->prepare($s);
$sth->execute;
while (my $line=$sth->fetchrow_array) {
push @ne_id_sz,"$line\n";
my $size=@ne_id_sz;
print $size,"\n";
$sth->finish;
}
}
打印结果怎么会是:
1
2
3
4
5
..
N
应该输出数据的长度(大小)才是呀?
作者: ynchnluiti    时间: 2008-11-30 17:50
原帖由 HF.SKY000 于 2008-11-30 17:29 发表
说得对,在FOR循环PRINT多带了一个"\N".
再请教个问题:

for (my $i=0;$iprepare($s);
$sth->execute;
while (my $line=$sth->fetchrow_array) {
push @ne_id_sz,"$line\n";
my $size=@ne_id_sz;
print  ...

my $size=@ne_id_sz;#这个得到的是数组元素个数,$size是个标量。
作者: HF.SKY000    时间: 2008-11-30 17:54
标题: 回复 #9 ynchnluiti 的帖子
应该输出数组的个数,是一个值才对呀,怎么会输出1 2 3 4 5 等等呢?
作者: ynchnluiti    时间: 2008-11-30 18:02
while (my $line=$sth->fetchrow_array) {
push @ne_id_sz,"$line\n";
my $size=@ne_id_sz;
print $size,"\n";
$sth->finish;
}

这是个循环。取出多少行记录就会打印多少次数组的个数。

$sth->execute;后取到一个记录集,类似这样:
记录    字段1    字段2   ....
1          abc       xxxx
2          def        xxxx
...

while (my $line=$sth->fetchrow_array) 应该写成:while (@row=$sth->fetchrow_array)
每次取一个记录(@row的每个元素是select指定的字段)。@row 分别等于 (abc, xxx),  (def, xxx) ....
作者: ynchnluiti    时间: 2008-11-30 18:12
原帖由 ynchnluiti 于 2008-11-30 18:02 发表

这是个循环。取出多少行记录就会打印多少次数组的个数。

$sth->execute;后取到一个记录集,类似这样:
记录    字段1    字段2   ....
1          abc       xxxx
2          def        xxxx
...

...

不是line和row的区别。
@line, @row都可以,或者其它名字。
作者: dl0622    时间: 2008-11-30 19:07
原帖由 HF.SKY000 于 2008-11-30 17:29 发表
说得对,在FOR循环PRINT多带了一个"\N".
再请教个问题:

for (my $i=0;$iprepare($s);
$sth->execute;
while (my $line=$sth->fetchrow_array) {
push @ne_id_sz,"$line\n";
my $size=@ne_id_sz;
print  ...


for (my $i=0;$i<@array ;$i++) {
my $s="select ne_id from ne_cell where n_confirm<>1 and ci=$array[$i] and city_id='114' order by 1";
$sth=$dbh->prepare($s);
$sth->execute;
while (my $line=$sth->fetchrow_array) {
push @ne_id_sz,"$line\n";       #每循环一次@ne_id_sz增加保存一个元素,该元素是该次循环的ne_id
my $size=@ne_id_sz;              #这里$size只是取数组元素的个数,因此下面就打印了每次循环的数组元素个数
print $size,"\n";
$sth->finish;
}
}




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2