我想从字符串中提取大小值。字符串可以采用以下两种方式之一进行格式化:
数据大小:(2000字节)
或
文件数据大小:(2082字节)
如果字符串存在于文件中,则只会出现一次。
到目前为止,我有:
#!/usr/bin/perl
use strict;
use warnings;
open FILE, "</tmp/test";
my $input = do { local $/; <FILE> };
my ($length) = $input =~ /(file)?\s*Data-Size: \((\d+) bytes\)/m;
$length or die "could not get data length\n";
print "length: $length\n";
问题似乎在于使word文件可选。我以为我可以这样做:
(文件)?
但是当word文件不存在时,这似乎停止了匹配。此外,当word文件存在时,它将$ length设置为字符串“file”。我认为这是因为文件的括号也意味着提取。
那么如何匹配两个字符串中的任何一个并提取大小值?
答案 0 :(得分:4)
您希望在$length
中进行第二次捕获。为此,您可以使用
my (undef, $length) = $input =~ /(file)?\s*Data-Size: \((\d+) bytes\)/;
或
my $length = ( $input =~ /(file)?\s*Data-Size: \((\d+) bytes\)/ )[1];
但更好的方法是避免捕捉你不想捕捉的东西。
my ($length) = $input =~ /(?:file)?\s*Data-Size: \((\d+) bytes\)/;
当然,您可以从
获得相同的结果my ($length) = $input =~ /Data-Size: \((\d+) bytes\)/;
顺便说一句,我删除了不必要的/m
。 /m
更改了^
和$
的含义,但模式中都没有。
答案 1 :(得分:0)
只需2美分,您可以通过其他方式进行可选匹配:
/(file |)\ s *数据大小:((\ d +)bytes)/