Заменить и отсортировать элементы массива Perl - PullRequest
0 голосов
/ 25 июля 2011

Я ищу элегантное решение для сортировки массива, а затем заменить числовые значения буквами. У меня тут кое-что работает, но это огромный монстр if / else, который, я уверен, можно написать гораздо короче.

Пример кода:

my $values = "70,20,50";
my @singlevalues = sort(split(/,/,$values));
ifmonster();
my $result = "RBG";

$values содержит три цветовых значения, где первое представляет «R», второе «G» и последнее «B». Я хочу отсортировать эти значения и, в конце концов, получить строку типа $result, которая отсортирована от самой большой до самой маленькой, представленной буквами.

Таким образом, «70,20,50» приводит к «RBG», а «20,50,30» приводит к «GBR».

Спасибо

Ответы [ 6 ]

5 голосов
/ 25 июля 2011

Решение без хеша:

my @color = split /,/, $value, 3;
my @order = sort { $color[$b] <=> $color[$a] } 0..2;
my $result = join "", qw(R G B)[@order];

В списке @order хранится перестановка, которая позднее применяется к списку букв.

3 голосов
/ 25 июля 2011

Звучит так, будто хеш хранит данные так, как вы хотите получить к ним доступ. Построить его довольно просто:

#!/usr/bin/perl

use strict;
use warnings;

my $values = "70,20,50";
my %components_by_name;
@components_by_name{qw/R G B/} = split ",", $values;
my $result = join "",
    sort { $components_by_name{$b} <=> $components_by_name{$a} }
    keys %components_by_name;

print "$result\n";

Вы можете объявить пустой хеш, сказав:

my %hash;

При присвоении хешу вы можете сказать

$hash{key} = "value";

Но если назначить группу значений, ключи которых вы знаете заранее, часто проще использовать фрагмент хеша:

@hash{"key 1", "key 2", "key 3"} = ("value 1", "value 2", "value 3");

Если ваши ключи не содержат пробелов, вы можете использовать оператор qw//, чтобы уменьшить количество шума в линии

@hash{qw/key1 key2 key3/} = ("value 1", "value 2", "value 3");

Доступ к значению в хэше аналогичен доступу к значениям в массиве, но вместо [] используется {}, а ключ представляет собой строку вместо числа:

my $value = $hash{key1}; #$value now holds "value 1";

Чтобы получить все ключи в хэше, вы можете использовать функцию keys:

my @keys = keys %hash;
0 голосов
/ 25 июля 2011
my %hash;
my $values = "70,20,50";

@hash{split(/,/,$values)} = qw/R G B/;
print @hash{sort keys %hash};
0 голосов
/ 25 июля 2011

Вот график еще одного метода (хотя, вероятно, это путь C): уменьшите ifmonster до набора логических операций и выберите правильный ответ из предопределенного массива.

# defined once
our @rgbindex = qw(RGB GRB null GBR RBG null BRG BGR); 

# later, e.g. in a sub
my ($r, $g, $b) = split /,/, $values;
my $i = (($r < $g) ? 1 : 0)
      + (($r < $b) ? 2 : 0)
      + (($g < $b) ? 4 : 0);
return $rgbindex[$i];

null в @rgbindex появляются потому, что они соответствуют недопустимым установкам. (А также 2 ^ 3 (количество битовых комбинаций) = 8, но 3! (Количество перестановок) составляет всего 6)

0 голосов
/ 25 июля 2011

Попробуйте это

#!/usr/local/bin/perl
my $values = "70,20,50";
my @singlevalues = split(/,/,$values);
my %colourMap = ();

$colourMap{$singlevalues[0]} = 'R';
$colourMap{$singlevalues[1]} = 'G';
$colourMap{$singlevalues[2]} = 'B';

foreach $key(sort {$b <=> $a} keys %colourMap)
{
    $result = $result . $colourMap{$key};
}

print $result;
0 голосов
/ 25 июля 2011

Это работает для вашего конкретного примера.Я оставлю это вам обобщать.:)

my $values = "70,20,50";
my @values = split(/,/,$values);
my $hash = {$values[0] => "R", $values[1] => "G", $values[2] => "B"};
print(join("", (map {$hash->{$_}} (sort { $b <=> $a } @values))));
print "\n";

(отредактировано для устранения проблемы, обнаруженной Часом Оуэнсом в комментариях ниже.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...