免费注册 查看新帖 |

Chinaunix

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

如何检测到pipe的输入 [复制链接]

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-06-19 15:17 |只看该作者 |倒序浏览


如下程序
my @Args;
while ( $_ = shift @ARGV){
    push @Args, glob($_);
}
@Args = uniq @Args;
print Dumper \@Args;
### 依次处理 ARGV的输入
### 继续处理pipe的输入
问题是如何在此处检测到有pipe的输入

用例1
1 foo.pl a.txt
处理a.txt
2. foo.pl
直接退出
3. cat log.txt | foo.pl a.txt b.txt
依次处理 a.txt b.txt (方式与pipe进来的的不同)
最后处理 pipe的输入

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
2 [报告]
发表于 2014-06-19 15:53 |只看该作者
本帖最后由 jason680 于 2014-06-19 15:58 编辑

回复 1# ttcn_cu

STDIN
or simple way by
<>
   
refer to: perldoc perlop

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
3 [报告]
发表于 2014-06-19 16:09 |只看该作者
jason680 发表于 2014-06-19 15:53
回复 1# ttcn_cu

STDIN


STDIN会卡住

Diamond不是我要的,也会卡住
我对文件和pipe的处理机制不同,不能用一个循环来套用

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
4 [报告]
发表于 2014-06-19 16:21 |只看该作者
回复 3# ttcn_cu

try follow ways:

1. vec and select

2. IO::Select and can_read

3. alarm   

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
5 [报告]
发表于 2014-06-19 22:21 |只看该作者
本帖最后由 rubyish 于 2014-06-19 21:16 编辑
  1. #!/usr/bin/perl -w
  2. use 5.018;

  3. die "\@ARGV == 0 : DIE$/" if @ARGV == 0;

  4. say "dosomething ARGV";
  5. say 'You have ', ~~ @ARGV, " ARGV files";

  6. while ( my $file = shift @ARGV ) {
  7.     say $file;
  8. }

  9. exit unless -p STDIN;

  10. say "dosomething STDIN";

  11. while (<>) {
  12.     print "Hello\t$_";
  13. }
复制代码

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
6 [报告]
发表于 2014-06-20 00:44 |只看该作者
jason680 发表于 2014-06-19 16:21
回复 3# ttcn_cu

try follow ways:


试了半天原来IO::Select 在Win下只能支持socket,汗
还好我可以放弃在win下的这个需求,只要Linux的设备能实时转换就行了,Win下只需处理log 文件

my $Select = IO::Select->new(\*STDIN);
if ($Select->can_read(0.5)) {
    while (<STDIN>) {
        say "from PIPE",$_;
    }
}

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
7 [报告]
发表于 2014-06-20 00:45 |只看该作者
回复 5# rubyish


    你这个过不了scenario 2

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
8 [报告]
发表于 2014-06-20 01:17 |只看该作者

回复 7# ttcn_cu
update~

   

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
9 [报告]
发表于 2014-06-20 12:36 |只看该作者
回复 8# rubyish

原来还有 -p的用法,之前只用过 -e -f -t -l

    赞!这下两个系统都能用了  感谢大侠

http://perldoc.perl.org/functions/-X.html

google 把minus 符号理解成排除,难怪我搜了好久都没找到文档
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP