String while循环中两个字符串匹配的Perl第一个实例

String while循环中两个字符串匹配的Perl第一个实例,string,perl,String,Perl,我想问一下,在while循环中找到两个不同字符串的第一个实例的最简单方法是什么。我正在动态搜索日志中的两个字符串,字符串的顺序不是必需的,任何一个都可以随时出现。但是,有时在日志的更深处(在第一个实例之后)还会有相同字符串的更多实例,因此我希望只收集两个字符串的第一个实例,并收集必要的时间戳。到目前为止我掌握的代码是 while(<$log_DUT>) { $fh_DUT->print($_); if (m/<\sOPERATOR\s\{[^,]+,\s[

我想问一下,在while循环中找到两个不同字符串的第一个实例的最简单方法是什么。我正在动态搜索日志中的两个字符串,字符串的顺序不是必需的,任何一个都可以随时出现。但是,有时在日志的更深处(在第一个实例之后)还会有相同字符串的更多实例,因此我希望只收集两个字符串的第一个实例,并收集必要的时间戳。到目前为止我掌握的代码是

while(<$log_DUT>) {
    $fh_DUT->print($_);
    if (m/<\sOPERATOR\s\{[^,]+,\s[^,]+,\s\d+\}\s\[SUB0\]/){
        $dsub1found = 1;
        open (DUTfFILE, ">>", "$TimeDutfsub1");
        print DUTfFILE DUTcurTime(),"\n";
        close (DUTfFILE);
    }

    if (m/<\sOPERATOR\s\{[^,]+,\s[^,]+,\s\d+\}\s\[SUB1\]/){
        $dsub2found = 1;
        open (DUTfFILE, ">>", "$TimeDutfsub2");
        print DUTfFILE DUTcurTime(),"\n";
        close (DUTfFILE);
    }
    last if ($dsub1found & $dsub2found == 1);
}
while(){
$fh\U DUT->打印($);

if(m/首先,您似乎需要在while循环的一次迭代中匹配这两个字符串(基于事实,有两个单独的if语句)。对于这种情况,您应该在每次迭代开始时将$dsub1found和$dsub2found初始化为零

其次,&'是一个按位and运算,它可能不是您想要的。我想您指的是&&

if ($dsub1found && $dsub2found == 1)
这将检查$dsub1found是否为true,$dsub2found是否等于1。如果这两个变量的初始值为0,则

if ($dsub1found && $dsub2found)
就足够了。但是,如果希望两者都等于1,则需要:

if ( $dsub1found == 1 and $dsub2found == 1 )
如果仍然不起作用,请尝试在while循环结束时打印$dsubfound变量值以进行调试。也可以打印输入,然后查看发生了什么。

while(){
while (<$log_DUT>) {
    $fh_DUT->print($_);
    if (!$dsub1found && m/<\sOPERATOR\s\{[^,]+,\s[^,]+,\s\d+\}\s\[SUB0\]/){
       ...
    }

    if (!$dsub2found && m/<\sOPERATOR\s\{[^,]+,\s[^,]+,\s\d+\}\s\[SUB1\]/){
       ...
    }

    last if $dsub1found && $dsub2found;
}
$fh\U DUT->打印($);
如果(!$dsub1found&&m/首先,除非你有计划,否则我会说你很幸运

您的if语句应该有效,因为

(1&1)=1,仅针对1进行正确检查

即使==的优先级高于-,也适用于您

($a&$b==1)=>($a&($b==1))

案例1 a=0,b=0=>(0&(0==1))=>(0&0)=>(0)False

案例2 a=0,b=1=>(0&(1==1))=>(0&1)=>(0)False

案例3 a=1,b=0=>(1和(0==1))=>(1和0)=>(0)错误

案例4 a=1,b=1=>(1&(1==1))=>(1&1)=>(1)true

您的测试似乎对我有用,我的文件输入是“asdba1ba2b”,在新行中是“asdba2b”,它只在第一个实例中打印ab

while ( <$FH> )
{
  if ( $_ =~ /a/ )
  {
    $flag_a=1;
    print $_ ;
  }
  if ( $_ =~ /b/ )
  {
    $flag_b=1;
    print $_ ;
  }

  last  if( $flag_a & $flag_b ==1 );

}
while()
{
如果($\=~/a/)
{
$flag_a=1;
打印美元;
}
如果($\=~/b/)
{
$flag_b=1;
打印美元;
}
最后一个if($flag_a和$flag_b==1);
}

检查您是否在某处使用dsub1found和dsub2found值,因为您的if条件非常依赖于此。我建议您使用上述建议,并使您的id条件更加健壮。

谢谢Ikegami,这看起来是我所追求的类型。之所以重复,纯粹是因为我是Perl的初学者,但最终通过练习,我希望将来能够缩短我的脚本,使其更有效。但现在,我对重复格式的理解更加清晰。我尝试过你的缩短脚本,但它在“$TimeDutfsub$n”处失败,说“$TimeDutfsub”需要定义“这种重复纯粹是因为我是Perl的初学者”,对不起,我的意思是修辞。我可以说但是,消除所有重复是很容易的。关于
$TimeDutfsub
,我没有注意到前面的
$
。我以为您正在创建名为
TimeDutfsub1
TimeDutfsub2
的文件。您必须使用数组。
my@TimeDutfsub=(…,…);
并使用
$TimeDutfsub[$n]
(更新了使用阵列的答案。)
while ( <$FH> )
{
  if ( $_ =~ /a/ )
  {
    $flag_a=1;
    print $_ ;
  }
  if ( $_ =~ /b/ )
  {
    $flag_b=1;
    print $_ ;
  }

  last  if( $flag_a & $flag_b ==1 );

}