Regex 可变长度查找在perl文件中不起作用,但在一行程序中起作用
如果我将Regex 可变长度查找在perl文件中不起作用,但在一行程序中起作用,regex,perl,regex-lookarounds,lookbehind,Regex,Perl,Regex Lookarounds,Lookbehind,如果我将s/(?)放入一个perl文件中,并尝试运行它,它将发出警告:可变长度查找在regex中是实验性的;标记为并失败 但是,如果放入一个perl one liner,它将成功运行,尽管仍有人警告说,可变长度查找在regex中是实验性的;标记为 是当前的设计还是我用错了 更新:在v5.30之前,我使用的是perl 5.31.3,带有不确定“可变宽度”模式的正向查找无法编译,并且未实现可变长度查找错误 在v5.30中,您需要使用最多可匹配255个字符的查找模式。 使用lookback断言(如(?
s/(?)放入一个perl文件中,并尝试运行它,它将发出警告:可变长度查找在regex中是实验性的;标记为
并失败
但是,如果放入一个perl one liner,它将成功运行,尽管仍有人警告说,可变长度查找在regex中是实验性的;标记为
是当前的设计还是我用错了
更新:在v5.30之前,我使用的是perl 5.31.3,带有不确定“可变宽度”模式的正向查找无法编译,并且未实现可变长度查找
错误
在v5.30中,您需要使用最多可匹配255个字符的查找模式。
使用lookback断言(如(?实验::vlb
警告类别
是为了提醒您,精确的行为可能会发生变化
根据现场使用的反馈
如果您使用(?Perl不关心代码是通过-e
还是通过文件提供的。在这两种情况下,代码的行为是相同的。失败的原因不是因为您使用了发布在文件中而不是命令行上的代码。还有一个您尚未识别的差异导致了行为上的差异
也就是说,您不应该使用您发布的成本。正如警告所大声宣布的,这是一个实验性功能。它未经验证,因此可能存在问题。此外,它可能会更改和删除,恕不另行通知
您可以使用以下替代方法来消除实验性可变长度查找的使用:
s/(?:href | src)。{0,40}(*跳过)(*失败)| jpg//g
(*FAIL)
导致模式不匹配,从而触发回溯。但是(*SKIP)
使其在与(?:href | src)匹配的字符串后的位置开始匹配。{0,40}
在以后的尝试中。该消息是一个警告,它实际上不应该导致任何失败。或者您在脚本中启用了致命警告,或者问题实际上存在于其他地方。我确实启用了致命警告。在我将其更改为使用警告;
或者正如Wiktor Stribiżew指出的那样,添加一个无警告qw(实验:vlb);
,它可以成功运行。警告是,作为实验功能,它可能有bug,可能会在不通知的情况下更改,也可能会在不通知的情况下删除。