我在测试时以及从文本文件行成功提取GUID时遇到问题。给定一个guid 12345678-1234-1234-1234-123456789abc,其中允许所有十六进制字符(我使用数字和abc显示每个子字符串包含的字符数),我尝试了这样的
my $myline = " set whatevervariable = \'aaaaaaaa-bbbb-cccc-1234-aaaaaaaabbbb\'";
my $guid =($myline =~ m/[A-Fa-f0-9]{8}[\-][A-Fa-f0-9]{4}[\-][A-Fa-f0-9]{4}[\-][A-Fa-f0-9]{4}[\-]([A-Fa-f0-9]){12}/gi)
测试工作正常,但是如何在之后提取GUID并将其用作perl脚本中的字符串? []运算符不起作用......
感谢您的帮助, -G。
答案 0 :(得分:1)
使用组:
my $guid =($myline =~ m/([A-Fa-f0-9]{8}[\-][A-Fa-f0-9]{4}[\-][A-Fa-f0-9]{4}[\-][A-Fa-f0-9]{4}[\-]([A-Fa-f0-9]){12})/gi)
# note parens here __^ and here __^
您还可以简化正则表达式:
my $guid =($myline =~ m/([a-f\d]{8}-[a-f\d]{4}-[a-f\d]{4}-[a-f\d]{4}-([a-f\d]){12})/gi)
根据daxim的评论,您需要添加a
修饰符:
my $guid =($myline =~ m/([a-f\d]{8}-[a-f\d]{4}-[a-f\d]{4}-[a-f\d]{4}-([a-f\d]){12})/gia)
或使用
my $guid =($myline =~ m/([[:xdigit:]]{8}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-([[:xdigit:]]){12})/gia)
答案 1 :(得分:1)
my $myline = " set whatevervariable = \'aaaaaaaa-bbbb-cccc-1234-aaaaaaaabbbb\'";
my ($guid) =($myline =~ m/([A-Fa-f0-9]{8}[\-][A-Fa-f0-9]{4}[\-][A-Fa-f0-9]{4}[\-][A-Fa-f0-9]{4}[\-][A-Fa-f0-9]{12})/gi);
有两处变化:
$variable = $some_other =~ m/.../g; - the $variable will contain number of matches. If you want the match, you should do:
我的($ variable)= ...`。如果文件中实际有多个guid的更改,请使用:my @guids = $ myline = ~m /.... / g; 此外 - 由于你使用的是// i flag,因此无需使用[A-Fa-f] - 简单的[a-f]就足够了。更重要的是 - 你不必做[ - ]事情。 - regexps中的角色并不神奇。
这一切总结为:
my @guids = $myline =~ m/([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/gi;