循环失败。这个数组有什么问题?
我希望正则表达式在解析第一个字符串时返回B
,而在解析第二个字符串时返回M
。
如何构建这样的正则表达式?
#!/usr/bin/perl
use warnings;
use strict;
my $a = "0.0 B/s";
my $b = "12.0 MiB/s";
while (defined (my $s = shift ("$a", "$b"))) {
my $unit = $1 if ($a =~ m/.*([KMGT])i?B\/s$/);
print "$unit\n";
}
答案 0 :(得分:2)
shift
旨在与数组一起使用,而不是列表。如果要使用while
循环,则需要预先声明包含$a
和$b
的数组(顺便说一下,这是变量名称的错误选择)。< / p>
话虽如此,for
循环结构在这里是更自然的选择:
for my $s ( $var1, $var2 ) { ... }
鉴于您正在尝试提取测量单位,为什么不以稍微不同的方式做事情:
say for map { my ( $s ) = /$regex/; $s } $var1, $var2;
答案 1 :(得分:1)
while
有问题。 $a
,则在内部循环中使用变量$s
。我会这样用它:
#!/usr/bin/perl
use warnings;
use strict;
my $a = "0.0 B/s";
my $b = "12.0 MiB/s";
foreach my $s($a, $b) {
print $1 if ($s =~ m/.*([KMGT])i?B\/s$/);
}
答案 2 :(得分:1)
您需要另一个替代:
for ($a, $b) {
if (m!((?:[KMGT]i)?B)/s$!) {
my $unit = $1;
$unit =~ s/(.).*/$1/;
print "$unit\n" if $unit;
}
}