2009-09-21 78 views
2

如果我有一个由括号中的元组组成的字符串,我想从Perl中的元组中获得最大值?例如:在Perl中从括号中删除键 - 值对

输入:[每天,32] [HOHO,16] [toodledum,128] [越后,4]

输出:128

+0

待办事项你关心所有其他的价值?你以后需要使用“toodledum”吗? – innaM 2009-09-22 07:18:14

回答

2

对于输入提供:

$input = "[everyday,32][hoho,16][toodledum,128][echigo:4]"; 
$max = -Inf; 
foreach ($input =~ /\[\w+,(\d+)\]/g) { 
    $max = $_ if $max < $_; 
} 
print $max; 

如果这些值可能是浮点值,则使用([^\]]+)而不是(\d+)

+0

我建议总是声明一个迭代器变量 - 即foreach我的$ value($ input ....) - 而不是依赖于$ _,因为它有时会以意想不到的方式在你的下面改变。可能不是这种情况,但这是一个很好的习惯。 – Ether 2009-09-22 00:16:29

5

如果你想要所有的数据,你可以先把它放到一个散列中。

my %data = $str =~ /\[([^,]+),([^\]]+)\]/g; 
use List::Util qw'max'; 
my($max) = max(values %data); 
print "max: $max\n"; 

如果你想知道哪个键(S)使用该号码,然后你可以使用一个grep

print "key: $_\n" for grep { $data{$_} == $max } keys %data; 

如果你真的只需要最大值:

use List::Util qw'max'; 
print max $str =~ /\[[^,]+,([^\]]+)\]/g; 
+0

胡萝卜标志是什么意思? – biznez 2009-09-22 07:34:39

+1

通常情况下[]表示匹配括号中的任何一个字符(例如a [bc] d会匹配abd,acd但不匹配abcd)。 '^'否定它,所以一个[^ bc] d会匹配aed,但不匹配abd。 – 2009-09-22 12:45:51