免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 11610 | 回复: 12
打印 上一主题 下一主题

PERL中怎么删除一空行 [复制链接]

论坛徽章:
0
跳转到指定楼层
[收藏(0)] [报告]
发表于 2008-11-30 15:44 |只看该作者 |正序浏览
5可用积分
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循环之后输出却有空行了?怎样才能取掉空行呢?

论坛徽章:
0
12 [报告]
发表于 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;
}
}

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
11 [报告]
发表于 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都可以,或者其它名字。

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
10 [报告]
发表于 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) ....

论坛徽章:
0
9 [报告]
发表于 2008-11-30 17:54 |只看该作者

回复 #9 ynchnluiti 的帖子

应该输出数组的个数,是一个值才对呀,怎么会输出1 2 3 4 5 等等呢?

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
8 [报告]
发表于 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是个标量。

论坛徽章:
0
7 [报告]
发表于 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
应该输出数据的长度(大小)才是呀?

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
6 [报告]
发表于 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);
复制代码

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
5 [报告]
发表于 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,就会多输出一个空行.

论坛徽章:
0
4 [报告]
发表于 2008-11-30 16:43 |只看该作者

回复 #4 machine 的帖子

呵呵,通过FOR循环输出发现是有空行.

论坛徽章:
0
3 [报告]
发表于 2008-11-30 16:37 |只看该作者
while (<READ> {
                chomp;
                @array=<READ>;
                                #print @array;  
                }
你这程序我不有点读不懂。
想去空行这样不就行了:

while (<READ> {
               s/^\s*$//g;
               print;  
                }
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP