所以我试图添加一些给定的时间,例如:
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 "$_";
}
但是我的正则表达式无效。
我也不知道如何添加它们。
所以有什么建议吗?
答案 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";
}
说明:
您的代码有两个问题:
您的正则表达式与持续时间(/\b\(\d:\d\)\b/
)匹配不正确。例如,\d
只能匹配一个数字,而在您的情况下,:
的两边都有两个;
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使用从原始对应元素派生的元素构建新列表(或散列)。