在Perl中添加数组的持续时间

时间:2013-10-15 05:26:50

标签: regex arrays perl time grep

所以我试图添加一些给定的时间,例如:

my @arr = ("stuff (00:04)", "more stuff (02:59)", "extra stuff (00:00)");

和()的格式为(HH:MM)HH =小时,MM =分钟。所以我的想法是使用以下代码在()中提取持续时间:

my @new_arr = grep (/\b\(\d:\d\)\b/, @arr);
foreach (@new_arr){
    print "$_";
}

但是我的正则表达式无效。

我也不知道如何添加它们。

所以有什么建议吗?

4 个答案:

答案 0 :(得分:4)

修改后的代码:

my @arr = ("stuff (00:04)", "more stuff (02:59)", "extra stuff (00:00)");
my @new_arr = map { /\((\d+:\d+)\)/ ; $1 } @arr;
foreach (@new_arr){
    print "$_\n";
}

说明:

您的代码有两个问题:

  1. 您的正则表达式与持续时间(/\b\(\d:\d\)\b/)匹配不正确。例如,\d只能匹配一个数字,而在您的情况下,:的两边都有两个;

  2. grep计算列表的每个元素,并返回表达式返回true的元素。所以即使你的正则表达式是正确的,它将返回数组的整个元素,而不是匹配的部分。你应该使用map来代替表达式的结果,这样你就可以构造一个给出匹配部分的表达式。

答案 1 :(得分:2)

我建议将您的信息存储为哈希而不是数组:

my %times = ( 
    "stuff" => "00:04",
    "more stuff" => "02:59", 
    "extra stuff" => "00:00",
);

现在,你可以获取你的时间:

my $stuff_var = "stuff";
print "It took $stuff $time{$stuff} to run\n";

如果您的数据在数组中,则可以使用m//正则表达式对其进行解析:

my %times;
for my $time ( @arr ) {
    $time =~ /(.*)\s+(.+?)/;   # Parentheses mark stuff and time
    my $stuff = $1;
    my $time  = $2;
    $time{$stuff} = $time;
}

现在您有一个带有时间戳的哈希$time。如果您想分出小时和分钟,您将使用相同的技术。我会哈希哈希:

my %times;
for my $item ( @arr ) {
    $itme =~ /(.*)\s+(.+?)/;   # Parentheses mark stuff and time
    my $stuff = $1;
    my $time  = $2;
    $time{$stuff}->{TIME} = $time;
    $time =~ /(.*):(.*)/;
    $time{$stuff}->{HOUR} = $1;
    $time{$stuff}->{MINUTE} = $2;
}

现在$time{$stuff}->{TIME}将是(HH:MM),而$time{$stuff}->{HOUR}将是小时,$time{$stuff}->{MINUTES}将是分钟。

答案 2 :(得分:1)

每次在正则表达式中进行分组时,使用map()遍历数组的每个元素和提取:

@new_arr = map { m/\((\d{2}:\d{2})\)/ && $1 } @arr

它产生:

00:04 
02:59 
00:00

答案 3 :(得分:0)

只是一个额外的信息。 grep函数仅用于过滤数组。因此,使用地图功能是正确的选择。 map函数用于按元素方式转换列表:给定列表和代码块,map使用从原始对应元素派生的元素构建新列表(或散列)。