【发布时间】:2021-11-26 04:01:40
【问题描述】:
我有一个 Perl 脚本,我在其中循环执行 Web 服务调用。服务器返回一个多值 HTTP 标头,我需要在每次调用后对其进行解析,其中包含我需要进行下一次调用的信息(如果它不返回标头,我想退出循环)。
我只关心标题中的一个值,我需要使用正则表达式从中获取信息。假设header是这样的,我只关心“foo”的值:
X-Header: test-abc12345; blah=foo
X-Header: test-fgasjhgakg; blah=bar
我可以像这样得到标题值:@values = $response->header( 'X-Header' );。但是如何快速检查是否
- 有一个 foo 值,并且
- 解析并保存 foo 值以供下一次迭代使用?
理想情况下,我想做这样的事情:
my $value = 'default';
do {
# (do HTTP request; use $value)
@values = $response->header( 'X-Header' );
} while( $value = first { /(?:test-)([^;]+)(?:; blah=foo)/ } @values );
但grep、first(来自List::Util)等都返回整个匹配,而不仅仅是我想要的单个捕获组。我想通过循环遍历数组并在循环体内进行匹配/解析来避免弄乱我的代码。
我想要的可能吗?写它的最紧凑的方式是什么?到目前为止,我能想到的只是使用lookarounds 和\K 来丢弃我不关心的东西,但这不是超级可读的,并且会使正则表达式引擎执行很多不必要的步骤。
【问题讨论】: