为什么这个正则表达式在测试时匹配,而不是在perl中?

iam*_*sgt 0 regex perl grep

我有一个正则表达式,我需要确定某些函数类型是否在文件中.像这样:

$stringsetexists = grep {/void [s|S]et[\w]+\(\s*.*string/} <$fh>;
Run Code Online (Sandbox Code Playgroud)

这是从perl文件运行,尝试匹配.cpp文件中的以下函数:

void setChanName(const std::string & chanName)
void setChanNameFont(const std::string & font)
void setOSDMessage(const std::string & osdMessage)
void setOSDMessageFont(const std::string & font)
Run Code Online (Sandbox Code Playgroud)

当我void [s|S]et[\w]+\(\s*.*string 通过正则表达式测试程序(例如www.regextester.com)运行正则表达式(输入为:)时,所有这些匹配(是的,我知道它们只匹配"字符串"的结尾.这就是我想要的).

但是,当我在perl脚本中运行上述命令时,它找不到匹配项.我知道脚本正在打开文件,所以这不是问题.我知道perl脚本中的其他正则表达式.问题是什么?

编辑:混淆问题,以下正则表达式:

 $stringsetexists = grep {/inline void [s|S]et[\w]+\(\s*.*string/} <$fh>;
Run Code Online (Sandbox Code Playgroud)

在包含如下所示的行的文件上运行时工作得很好:

 inline void setIPv6Address(const std::string & ipv6Address)
Run Code Online (Sandbox Code Playgroud)

(并非正则表达式中唯一的区别是在"void"之前添加了"inline".文件中唯一的区别是在"void"之前添加了"inline".

编辑2:扩展我已经放置的内容,相关的代码块在这里:

open $fh, "<", $file;
$stringsetexists = grep {/inline void [s|S]et[\w]+\(\s*.*string/} <$fh>; #this works for all files that contain "inline void"
if ($file eq "OSDSettings.h") #I know this part runs, because the print statement inside properly prints out that it is in OSDSettings.h
{
    $stringsetexists = grep {/void [s|S]et[\w]+\(\s*.*string/} <$fh>;
    print $file." opened: ".$stringsetexists."\n";
}
Run Code Online (Sandbox Code Playgroud)

pil*_*row 8

$fh在第二天之前倒带或重新打开grep.

这段代码:

grep { ... } <$fh>
Run Code Online (Sandbox Code Playgroud)

会耗尽 $fh,读取文件中的所有行.当您下次调用时grep { ... } <$fh>,没有更多行可以匹配,因为$fh它位于文件结尾.

  • 答对了!第一个`<$ fh>`读取文件的剩余部分,没有留下第二个`<$ fh>`来读取.更好的是,将文件加载到变量中.无论如何,整个文件都由现有代码加载到内存中. (2认同)