我有一个正则表达式,我需要确定某些函数类型是否在文件中.像这样:
$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)
$fh在第二天之前倒带或重新打开grep.
这段代码:
grep { ... } <$fh>
Run Code Online (Sandbox Code Playgroud)
会耗尽 $fh,读取文件中的所有行.当您下次调用时grep { ... } <$fh>,没有更多行可以匹配,因为$fh它位于文件结尾.
| 归档时间: |
|
| 查看次数: |
105 次 |
| 最近记录: |