替换和排序perl数组元素

时间:2011-07-25 09:19:32

标签: perl sorting

我正在寻找一种优雅的解决方案来对数组进行排序,然后用字母替换数值。我有一些在这里工作的东西,但它确实是一个巨大的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 个答案:

答案 0 :(得分:5)

无散列解决方案:

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

@order列表存储一个排列,后来应用于字母列表。

答案 1 :(得分:3)

听起来,哈希会以您希望的方式存储数据。构建它非常简单:

#!/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;

答案 2 :(得分:0)

这适用于您的具体示例。我会留给你概括。 :)

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";

(编辑修复Chas Owens在下面的评论中发现的问题。)

答案 3 :(得分:0)

试试这个

#!/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;

答案 4 :(得分:0)

这是另一种方法的图(虽然它可能是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];

@rgbindex中的null出现,因为它们对应于非法设置。 (还有2 ^ 3(位组合数)= 8,但3!(排列数)只有6)

答案 5 :(得分:0)

my %hash;
my $values = "70,20,50";

@hash{split(/,/,$values)} = qw/R G B/;
print @hash{sort keys %hash};