Linux 用perl脚本平铺窗口-嵌套数组是个坏主意吗?

Linux 用perl脚本平铺窗口-嵌套数组是个坏主意吗?,linux,arrays,perl,perl-data-structures,Linux,Arrays,Perl,Perl Data Structures,我正在编写一个脚本,它将在Perl中动态平铺X11窗口。到目前为止,我将使用一个包含窗口坐标、大小和ID的数组来存储会话期间平铺窗口的状态。这是一个好主意还是我应该以任何其他方式组织这些信息?数组的数组,或数组或哈希,或哈希的哈希,或数组的哈希的哈希在perl中非常好,perl中的数据处理如此简单的原因之一。你不必害怕他们 在Perl中,复合结构的标准表示形式是(受祝福的)散列。除非您有严重的性能问题,否则将数据分组为散列将是一个好主意 OTOH,数组适合于统一的数据。但是,当您有具有唯一ID的

我正在编写一个脚本,它将在Perl中动态平铺X11窗口。到目前为止,我将使用一个包含窗口坐标、大小和ID的数组来存储会话期间平铺窗口的状态。这是一个好主意还是我应该以任何其他方式组织这些信息?

数组的数组,或数组或哈希,或哈希的哈希,或数组的哈希的哈希在perl中非常好,perl中的数据处理如此简单的原因之一。你不必害怕他们

在Perl中,复合结构的标准表示形式是(受祝福的)散列。除非您有严重的性能问题,否则将数据分组为散列将是一个好主意

OTOH,数组适合于统一的数据。但是,当您有具有唯一ID的数据时(X窗口确实有ID,对吗?),哈希也是一种更自然的结构。你就这么说

do_something($windows->{$id}->{x});
而不是

foreach (@$windows) { 
    if ($_->{id} == $id ) { 
        do_something($_->{x});
    }; 
}

适当的结构取决于您将如何访问和处理数据结构。选择正确的结构是解决程序的一个重要部分。选择错误的结构,一个简单的问题就会变得困难。结构非常重要,有时您需要将现有结构转换为更适合您需要执行的工作类型的形式

以下两条基本规则将帮助您选择结构图元:

  • 如果要保持订单,请使用数组
  • 如果需要大量查找特定的名称、ID或其他信息,请使用哈希
  • 因此,如果您只想计算窗口数,请查找纵横比类似于屏幕的矩形数字,该数字大于窗口数,然后一次平铺一个窗口:只需使用数组

    如果您想执行一系列操作,如按应用程序名称查找窗口或其他需要许多不同查找的操作,请使用散列

    如果需要对多个键进行多次查找,并维护一个顺序,则可以创建指向相同基础引用的多个数据结构

    my @foo = (
        { name => 'a', id => '321' },
        { name => 'b', id => '123' },
    );
    
    my %foo_by_name = map { $_{name} => $_ } @foo;
    my %foo_by_id   = map { $_{id  } => $_ } @foo;
    

    如果您需要操作复杂的集合(添加和移除元素),请考虑包装对象中的各种结构,以确保所有底层结构都被统一管理。

    < P>我遵循的准则是:如果保持元素的顺序很重要,请使用数组;否则,使用散列


    散列比数组慢,但通过选择有意义的键,它们更容易维护。所以我更喜欢它们而不是数组。

    子数组的散列也很好!事实上,我很快就注意到了这一点,我很想尝试一下,但我担心这会把整个事情弄得一团糟。)PS:请确保您了解Data::Dumper(),它可以帮助您可视化您的混乱状态。>>适当的结构取决于。。。这正是《Unix编程的艺术》中所写的内容,也是我提出这个问题的原因。)谢谢你的回答,这很有帮助。我正在考虑一个sub,它会为任何作为它的参数发生的事情分配空间,不管它是一个窗口还是另一个splitting sub,后者不会有ID。但是无论如何,谢谢你的回答!不要认为总共处理40个元素会很慢,所以我会在这里考虑数组,谢谢!