2009-09-21 3 views
2

Что делать, если у меня есть строка, состоящая из кортежей в скобках, и я хотел бы получить максимальное значение из кортежа в Perl? Пример:Греческие пары ключевых значений из скобок в Perl

Входной сигнал: [повседневный, 32] [HOHO, 16] [toodledum, 128] [Echigo, 4]

Выход: 128

+0

Do вы заботитесь обо всех других ценностях? Вам нужно будет использовать «toodledum» позже? – innaM

ответ

2

Для ввода предусмотрены:

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

Используйте ([^\]]+) вместо (\d+), если значения могут быть значениями с плавающей запятой.

+0

Я бы предложил всегда объявлять переменную итератора - т. Е. Для получения моего значения $ ($ input ....) - вместо того, чтобы зависать от $ _, так как иногда это может измениться под вас неожиданными способами. Вероятно, не в этом случае, но это хорошая привычка. – Ether

5

Если вам нужны все данные, вы можете перенести их в хэш.

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

Если вы хотите знать, какой ключ() иметь этот номер, вы могли бы использовать grep

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

Если вам действительно нужно только максимальное значение:

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

Что означают знаки моркови? – biznez

+1

Обычно [] говорит, что соответствует любому из символов между скобками (например, [bc] d будет соответствовать abd, acd, но не abcd). «^» Отрицает это, так что [^ bc] d будет соответствовать aed, но не abd. –

Смежные вопросы