我正在编写一个脚本,它将在 Perl 中动态平铺 X11 窗口。到目前为止,我将使用包含窗口坐标、大小和 ID 的数组来存储会话期间平铺窗口的状态。这是一个好主意还是我应该以任何其他方式组织这些信息?
4 回答
适当的结构取决于您将如何访问和处理数据结构。选择正确的结构是解决程序的很大一部分。选择错误的结构,一个简单的问题就会变得困难。结构是如此重要,以至于有时您需要将现有结构转换为更适合您需要执行的工作的形式。
以下是帮助您选择结构元素的两个基本规则:
- 如果要保持订单,请使用数组。
- 如果您需要对特定名称、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;
如果您需要操作复杂的集合(添加和删除元素),请考虑将各种结构包装在一个对象中,以确保所有底层结构都得到一致的管理。
数组的数组,或数组或散列,或散列的散列,或数组的散列散列的散列在 perl 中非常棒,这也是 perl 中数据处理如此简单的原因之一。你不需要害怕他们!
嗯,Perl 中复合结构的标准表示是(祝福的)哈希。除非您有严重的性能问题,否则将数据分组到散列中将是一个好主意。
OTOH,数组适用于统一数据。但是,当您拥有具有唯一 id 的数据时(X 窗口窗口确实有 id,对吗?),哈希又是一种更自然的结构。所以你就说
do_something($windows->{$id}->{x});
并不是
foreach (@$windows) {
if ($_->{id} == $id ) {
do_something($_->{x});
};
}
我遵循的准则是:如果保持元素的顺序很重要,请使用数组;否则,使用哈希。
哈希比数组慢,但通过选择有意义的键,它们可以更容易维护。所以我更喜欢它们而不是数组。