perl - 如何每行获得两个匹配项
问题描述
我需要一个词后PgTrx
一个词Statusdescription
日志样本:
status=1&newMainBalance=5486&serviceAmount=700&ExternalTrxId=asdf&PgTrxId=tfpsadf&amount=0&statusDescription=Failed&customerCode=1.1&newDedicatedBalance=0&secureHash=56a7sdyf&paidAmount=1000&responseMsg=%a1%a1%A1(PG_ID)&language=enHTTP/1.1"200186243**1/1210669**1"-""-""-""https://example.com.eg?statusDescription=Failed&externalTrxId=123&status=203&secureHash=asdf&pgTrxId=asdf
我尝试了以下方法,但之后我只得到 1 个字statusdescription
:
perl -ne 'foreach my $p (split(/&/)) { if ($p =~ /statusDescription(=.*)/) { print "$1\n"; last } }'
cat file.txt | perl -ne 'forea ch my $p (split(/&/)) { if ($p =~ /statusDescription(=.*)/) { print "$1\n"; last } }'
我想得到如下结果。
PgTrxId=tfpsadf&statusDescription=Failed
但我只有
statusDescription=Failed
解决方案
不要与分裂有关。将整行解析为哈希,然后选择所需的键:
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my @wanted = qw ( PgTrxId statusDescription );
while (<DATA>) {
my %param = m/(\w+)=(\w+)/g;
print Dumper \%param;
print join ( "&", map { "$_:$param{$_}" } @wanted ),"\n";
}
__DATA__
status=1&newMainBalance=5486&serviceAmount=700&ExternalTrxId=asdf&PgTrxId=tfpsadf&amount=0&statusDescription=Failed&customerCode=1.1&newDedicatedBalance=0&secureHash=56a7sdyf&paidAmount=1000&responseMsg=%a1%a1%A1(PG_ID)&language=enHTTP/1.1"200186243**1/1210669**1"-""-""-""https://example.com.eg?statusDescription=Failed&externalTrxId=123&status=203&secureHash=asdf&pgTrxId=asdf
如果你想把它作为一个衬里:
perl -ne '%p = m/(\w+)=(\w+)/g; print join ( "&", map { "$_=$p{$_}" } ) qw ( PgTrxId statusDescription ),"\n"'
为简洁起见,我在map
这里使用它,因为这在单列中很有用,但在功能上等同于:
my @list_of_wanted_things;
foreach my $word ( @wanted ) {
push ( @list_of_wanted_things, "$word=$param{$word}" );
}
print join "&", @list_of_wanted_things;
推荐阅读
- python - 为什么 tkinter 按钮在条目下时会被推开?
- docker - 需要帮助使用 nginx 代理 docker 为 LAMP 堆栈设置证书链
- django - django live reload 不适用于第二个 docker-compose 文件
- javascript - 如何使用 nodejs 读取 worldedit .schem 文件
- database - 无法在 Synapse Studio 中删除无服务器数据库
- visual-c++ - 基于 WebView2 的 ActiveX 控件和拦截 WM_LBUTTONDBLCLK
- python - 如何重新排列输入的拆分
- swift - 显示相同项目的动态列表,即使填充的列表都是唯一项目
- java - 接受许可时出错 - Android Studio
- javascript - 为什么带有等待的异步请求不等待响应数据?