根据Perl RegEx的频率对一组变量进行排序

时间:2014-03-01 20:12:10

标签: regex perl sorting arraylist lua

我正在尝试使用表或数组来列出和排序项目 以下序列的字母或项目,通过什么“吃” 首先(在捕获的perl RegEx中)这四个列表完全相同 项目,只是以不同的顺序连续输入。

输入项目:这些字母代表一个动作或输入 客户端。

  

a b c d

     

b c d a

     

c d b a

     

d a b c

perl regex:

^(\w+) eats (a|an) (\w+)\.$

所以匹配[4]将是捕获的项目。

这将触发RegEx将在客户端中使用'each'集合触发 字母(a,b,c,d)分别输入。那么四套a,b,c,d那个 将在轮流订单的基础上连续输入。以上 RegEx将以16x(每个字母一次)开火。我需要能够 这样排序,如果(a)每次都被吃掉,那么就会有 最高优先级下降。但它可能并不总是(a),它 可以是任何优先的字母。

我需要将此优先级列表显示到Geyser,例如

PrioList= Geyser.MiniConsole:new({
  name="PrioList",
  x="70%", y="50%",
  width="30%", height="50%",
})

然后我需要能够将每个字母设置为不同的优先级列表 或变量。因为每个单独的字母都表示不同 需要采取行动,所以我需要说

if (a == highestpriority) then 
do action / function()
end

我不确定如何编写能够执行的'for'语句 根据4组字母对这些项目进行排序和列出。我想 在每个序列之后,必须保存并重置列表 不知何故进入一个表或数组,并相互比较 最高优先级。但这严重超出了我所知道的范围 脚本,但我一定很想学这个。

1 个答案:

答案 0 :(得分:0)

如果我正确地理解你,一个选择是使用1)哈希来计算输入的第一个字母的频率,以及2)调度表以将每个字母与子例程相关联:

use strict;
use warnings;
use List::Util qw/shuffle/;

my %seen;
my %dispatchTable = (
    a => \&a_priority,
    b => \&b_priority,
    c => \&c_priority,
    d => \&d_priority
);

for my $i ( 1 .. 4 ) {
    my @chars = shuffle qw/a b c d/;
    print "Round $i: @chars\n";
    $seen{ $chars[0] }++;
}

my $priority = ( sort { $seen{$b} <=> $seen{$a} } keys %seen )[0];
print "Priority: $priority\n";

$dispatchTable{$priority}->();

sub a_priority {
    print "a priority sub called\n";
}

sub b_priority {
    print "b priority sub called\n";
}

sub c_priority {
    print "c priority sub called\n";
}

sub d_priority {
    print "d priority sub called\n";
}

示例运行输出:

Round 1: d c a b
Round 2: b a d c
Round 3: d b a c
Round 4: c d a b
Priority: d
d priority sub called

你说,“我需要能够对它进行排序,如果(a)每次都先吃掉......”以上尝试选择频率最高的项目 - 不是最初四次的项目。

在多个字母共享相同频率的情况下,您需要决定该怎么做,但这可能有助于提供一些方向。