如何在XS中获取Perl正则命名捕获的匹配结果?
该操作完全可以实现,具体实现逻辑和方法如下:
- 正则内嵌入的
(?{、(??{代码块执行时,会继承当前匹配的完整上下文,所有Perl正则相关内置变量均处于生效状态,你可以直接在代码块中使用$+{name}获取已完成匹配的命名捕获值,和正则外的调用方式完全一致。
示例代码如下:
上述代码运行后,嵌入代码块和正则外部打印的捕获值完全一致。my $test_str = "order_20240501_001"; if ($test_str =~ /order_(?<date>\d{8})_(?<id>\d{3})(?{ # 嵌入代码块内直接访问命名捕获 print "嵌入代码内获取到的日期:$+{date}, 订单ID:$+{id}\n"; }) /x) { print "正则外部获取到的日期:$+{date}, 订单ID:$+{id}\n"; } - 如果你需要在调用的C代码(通常是XS实现的函数)中获取命名捕获,可以通过Perl提供的C API直接访问
%+哈希的对应键值,示例C代码片段如下:
你在#include "EXTERN.h" #include "perl.h" #include "XSUB.h" SV* get_named_capture(const char* capture_name) { char sv_name[256]; // 构造对应Perl变量名,格式为+{捕获名} snprintf(sv_name, sizeof(sv_name), "+{%s}", capture_name); // 从Perl上下文获取对应标量 SV* capture_val = get_sv(sv_name, 0); // 返回值拷贝避免后续上下文销毁导致值失效 return capture_val ? newSVsv(capture_val) : &PL_sv_undef; }(?{代码块中调用上述XS实现的get_named_capture函数,传入捕获组名称即可拿到对应捕获值。
注意事项:只有已经完成匹配的命名捕获组才会被存入%+哈希,如果你在(??{动态生成正则的场景下访问还未完成匹配的捕获组,将无法拿到有效值。
内容的提问来源于stack exchange,提问作者AnArrayOfFunctions
相关产品推荐
相关产品推荐

