我要读取一个文件,例如包含以下内容的test.test
#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之后的内容...但是对于stdin或stdout,我希望在下一个#到一个表@stdin和@stdout之前把所有行都取出来。
我做了一个循环while ($line = <TEST>),这样它就会查看每一行。如果我看到一个模式/^#stdin:|/,我想移动到下一行,并将这个值放到一个表中,直到我看到下一个#。
如何移动到while循环中的下一行?
发布于 2010-11-09 03:03:31
根据用户的要求更新
如果我没理解错的话,你想在循环中多读一行吗?
如果是这样的话,您可以:
my $another_line =;
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:[|]/转义
https://stackoverflow.com/questions/4127019
复制相似问题