首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl readline问题

Perl readline问题
EN

Stack Overflow用户
提问于 2010-11-09 02:59:18
回答 1查看 450关注 0票数 1

我要读取一个文件,例如包含以下内容的test.test

代码语言:javascript
复制
 #test:testdescription\n
 #cmd:binary\n
 #return:0\n
 #stdin:|\n
 echo"toto"\n
 echo"tata"\n
 #stdout:|\n
 toto\n
 tata\n
 #stderr:\n

我成功地获取了#test:;#cmd: etc之后的内容...但是对于stdinstdout,我希望在下一个#到一个表@stdin@stdout之前把所有行都取出来。

我做了一个循环while ($line = <TEST>),这样它就会查看每一行。如果我看到一个模式/^#stdin:|/,我想移动到下一行,并将这个值放到一个表中,直到我看到下一个#

如何移动到while循环中的下一行?

EN

回答 1

Stack Overflow用户

发布于 2010-11-09 03:03:31

根据用户的要求更新

如果我没理解错的话,你想在循环中多读一行吗?

如果是这样的话,您可以:

  1. 只需在循环内执行另一行读取。

my $another_line =;

  • 保留一些状态标志,并在循环的下一次迭代中使用它,并在缓冲区中的stdin之间累积行:

my $last_line_was_stdin = 0;my @line_buffer = ();while ($line =){ if (/^#stdin:|/) {##处理自上次"stdin“以来累计的所有行的代码# @line_buffer = ();$last_line_was_stdin = 1;next;}推送@line_buffer,$line;}

此解决方案可能无法100%满足您的需求,但它定义了您在状态机实现中需要遵循的模式:读取一行代码。检查你的当前状态(如果重要的话)。根据当前状态和行中的模式,验证对当前行执行什么操作(添加到缓冲区?改变状态?如果更改状态,是否根据上一个状态处理缓冲区?)

另外,根据你的评论,你的正则表达式中有一个bug -管道(|字符)在正则表达式中意味着" OR“,所以你说”如果行以#stdin开头或者匹配一个空的正则表达式“-后一部分总是正确的,所以你的正则表达式将匹配100%的时间。您需要通过/^#stdin:\|//^#stdin:[|]/转义

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4127019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档