免费注册 查看新帖 |

Chinaunix

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

Perl什么情况下需要使用$|=1清除缓存 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-25 10:08 |只看该作者 |倒序浏览
如题,请教各位大神,我经常看到一些Perl的书籍中有例子设置$|=1,这个意思我查询了资料就是$|值在非零时对当前选定的文件执行写或者打印操作后强制清除缓冲区。
我看过两种情况使用这个东东:我的问题是我们为什么要这么做,另外还有多少种情况下我们需要这么做,希望有大神给出一个比较全的回答,多谢了!
1、在磁盘坏块时需要手动递归检查数据是否被损坏。
2、在文件句柄中打开过滤器时,比如
#!/usr/bin/perl
$|=1;
$tmpfile="temp";
open(DB,"data.txt") or die "Can't open the file: $!\n";
open(SAVED,">&STDOUT") or die "$!\n";
open(STDOUT,">$tmpfile") or die "Can't open: $!\n";
open(SORT,"|sort +1") or die;

print SORT while(<DB>);
close SORT;

open(STDOUT,">&SAVED") or die "Can't open: $!\n";
print "Here wo are printing to the screen again.\n";

rename("temp","data.txt");

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
2 [报告]
发表于 2013-07-25 10:22 |只看该作者
回复 1# oracle_sky


    当你想马上输出就需要它啊。

论坛徽章:
0
3 [报告]
发表于 2013-07-25 10:24 |只看该作者
能否详细点呢,多谢!回复 2# blackold


   

论坛徽章:
1
双子座
日期:2013-11-06 17:18:01
4 [报告]
发表于 2013-07-25 10:31 |只看该作者
autoflush output
如果$|=1,则是无buffer输出。

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
5 [报告]
发表于 2013-07-25 10:46 |只看该作者
本帖最后由 stanley_tam 于 2013-07-25 10:50 编辑

例如你写入文件一行 print {$file_handler} "something"
这个时候你打开文件去看,something是不会在里面的。估计得close $file_handler才会写入。
要是$|=1的话,文件会立马写入。

论坛徽章:
0
6 [报告]
发表于 2013-07-25 12:11 |只看该作者
回复 5# stanley_tam


    我测试了下,发现和你说的不太相符,不知道是否是我理解有误。
>more test.pl
#!/usr/bin/perl
$|=1;
open(DB,">data") or die "Can't open: $!\n";

print DB "This is a test!\n";

sleep 100;

>./test.pl &
>date
Thu Jul 25 12:05:57 CST 2013
>date
Thu Jul 25 12:06:20 CST 2013
>more data
啥都没有,说明并没有立即写入,还得和原来一样必须close 掉文件句柄或者程序运行结束后才会写入。

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
7 [报告]
发表于 2013-07-25 12:59 |只看该作者
额。偶错了,那个file handler应该是一个pipe 或者 socket回复 6# oracle_sky


   

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
8 [报告]
发表于 2013-07-25 13:02 |只看该作者

论坛徽章:
0
9 [报告]
发表于 2013-07-31 09:00 |只看该作者
回复 6# oracle_sky

要先调用select才可以的

open F, '>', 'test.txt';
select F;
$| = 1;
#write file
close F:
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP