gpt4 book ai didi

arrays - Bash 关联数组排序

转载 作者:行者123 更新时间:2023-11-29 09:01:07 26 4
gpt4 key购买 nike

如果我想在 bash 中分别传递关联数组的键和值,并使用类似的东西

./foo.py -k "${!args[@]}" -v "${args[@]}"

它们会以相同的顺序出现吗?我真的不在乎其他 k=v 对存储在什么地方,但我确实需要知道我是否可以指望出现的键和值,以便键数组中的第 3 个项目实际上是值数组中的第 3 项。

我知道关联数组是“无序的”,无论您将它们添加到数组中的顺序与它们的输出方式无关,但我想知道底层存储行为是否意味着它们将始终以相同的顺序输出.

最佳答案

根据我在 Bash 4.3 版 assoc.c 中找到的代码,似乎答案是肯定的,键和值将始终以相同的顺序排列,可用 here .数组的键和值分别由函数 assoc_keys_to_word_listassoc_to_word_list 检索。这两个函数都委托(delegate)给 assoc_to_word_list_internal,它在两种情况下运行相同的循环,并且仅根据 t 参数区分要检索的项目类型(第 482-503 行) ):

static WORD_LIST *
assoc_to_word_list_internal (h, t)
HASH_TABLE *h;
int t;
{
WORD_LIST *list;
int i;
BUCKET_CONTENTS *tlist;
char *w;

if (h == 0 || assoc_empty (h))
return((WORD_LIST *)NULL);
list = (WORD_LIST *)NULL;

for (i = 0; i < h->nbuckets; i++)
for (tlist = hash_items (i, h); tlist; tlist = tlist->next)
{
w = (t == 0) ? (char *)tlist->data : (char *)tlist->key;
list = make_word_list (make_bare_word(w), list);
}
return (REVERSE_LIST(list, WORD_LIST *));
}

如果您想知道,make_word_list 是在 array.c/h 中定义的。它只是将一个新的 WORD_LIST 节点附加到现有链表。

虽然这不提供契约(Contract)保证您期望的行为将始终得到支持,但这是一个很好的迹象,表明您可以安全地使用您的调用约定,至少现在是这样。关联数组仅适用于 Bash 的事实使实现更像是一个有效的引用。

关于arrays - Bash 关联数组排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41230589/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com