我有一些 Perl 程序来检查日志文件并打印使用特定正则表达式模式找到的行。
到目前为止,这有效。
现在我想扩展程序,不仅找到模式,而且找到后更改消息。
我做了一个简化的例子:
my $av_tmp_LOGSTRING = "PACKET_INFO: Dst: 192.168.0.1:123 {router}, Src: 192.168.0.1:44701 (UDP): connection refused";
my $av_tmp_PATTERN = 'PACKET_INFO: Dst: (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):\d{1,5} \{router\}, (Src: (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})):\d{1,5} \(UDP\): connection refused';
if ( $av_tmp_LOGSTRING =~ m/$av_tmp_PATTERN/p )
{
print ${^PREMATCH}, "\n";
print ${^MATCH}, "\n";
print ${^POSTMATCH}, "\n";
}
这个效果很好。在字符串中找到模式并打印。
现在通过 preplace 操作进行扩展!
my $av_tmp_LOGSTRING = "PACKET_INFO: Dst: 192.168.0.1:123 {router}, Src: 192.168.0.1:44701 (UDP): connection refused";
my $av_tmp_PATTERN = 'PACKET_INFO: Dst: (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):\d{1,5} \{router\}, (Src: (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})):\d{1,5} \(UDP\): connection refused';
if ( $av_tmp_LOGSTRING =~ m/$av_tmp_PATTERN/p )
{
print ${^PREMATCH}, "\n";
print ${^MATCH}, "\n";
print ${^POSTMATCH}, "\n";
}
my $av_tmp_REPLACE = 'aaa \g{1}';
$av_tmp_LOGSTRING =~ s/$av_tmp_PATTERN/$av_tmp_REPLACE/e;
print $av_tmp_LOGSTRING, "\n";
打印:
aaa\g{1}
预计:
aaa 192.168.0.1
任何提示都表示赞赏我的错误所在。
将替换字符串更改为:
my $av_tmp_REPLACE = "aaa $1";