2

循环失败。数组有什么问题?

我希望正则表达式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";
}
4

3 回答 3

2

shift旨在用于数组,而不是列表。如果要使用while循环,则需要预先声明一个包含$aand的数组$b(顺便说一下,这对于变量名来说是一个不好的选择)。

话虽如此,for循环构造是这里更自然的选择:

for my $s ( $var1, $var2 ) { ... }

鉴于您正在尝试提取测量单位,为什么不以稍微不同的方式做事:

say for map { my ( $s ) = /$regex/; $s } $var1, $var2;
于 2013-04-18T14:39:33.090 回答
1
  1. 你的while有问题。
  2. 当您$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$/);
}
于 2013-04-18T14:38:09.743 回答
1

你需要另一个替换:

for ($a, $b) {
  if (m!((?:[KMGT]i)?B)/s$!) {
    my $unit = $1; 
    $unit =~ s/(.).*/$1/;
    print "$unit\n" if $unit;
  }   
}
于 2013-04-18T14:43:05.517 回答