while,array和regex的组合

时间:2013-04-18 14:31:23

标签: regex perl

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

我希望正则表达式在解析第一个字符串时返回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";
}

3 个答案:

答案 0 :(得分:2)

shift旨在与数组一起使用,而不是列表。如果要使用while循环,则需要预先声明包含$a$b的数组(顺便说一下,这是变量名称的错误选择)。< / p>

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

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

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

say for map { my ( $s ) = /$regex/; $s } $var1, $var2;

答案 1 :(得分:1)

  1. 您的while有问题。
  2. 如果要使用$a,则在内部循环中使用变量$s

  3. 我会这样用它:

    #!/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;
  }   
}