1

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

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

4 回答 4

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它,它返回表达式的结果,因此您可以构造一个给出匹配部分的表达式。

于 2013-10-15T06:28:19.457 回答
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}将是分钟。

于 2013-10-15T14:30:43.807 回答
1

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

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

它产生:

00:04 
02:59 
00:00
于 2013-10-15T06:21:21.997 回答
0

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

于 2013-10-15T12:36:43.297 回答