试图强制数组中的条目成为数组
Trying to force an entry in an array to be an array
我正在尝试在 gawk 中创建一个关联数组的关联数组,我最初尝试的是:
options[key][subkey] = 1
然而,当它到达这一行时,我毫不客气地收到错误 fatal: attempt to use scalar 'option["Declaration"]' as an array
("Declaration" 是我的程序使用的主要键之一,尽管我认为确切的值是无关紧要的。在程序的这个特定点,没有分配 "Declaration" 条目,尽管有些条目将 "Declaration" 作为其他条目的子键,这可能是有意义的)。
因此,通过一些谷歌搜索,我发现另一个 Whosebug question 看起来可以解决我的问题,所以我将以下代码放在它上面:
if (typeof(options[key])!="array") {
options[key] = 0;
delete options[key];
split("",options[key]);
}
但是,这也不起作用,而是现在给我错误:fatal: split: second argument is not an array
我做错了什么?
编辑:请注意,我不能在这里使用基本的二维数组......对于我正在做的事情,重要的是我将一个关联数组用于另一个数组,因为我需要能够稍后识别在给定键上使用的子键。
根据下面的要求,我发布了使用关联数组的相关函数,这可能有助于澄清发生了什么。
function add_concrete(key, concrete) {
if (key == concrete) {
return;
}
if (length(options[key])>0) {
for(i in options[key]) {
add_concrete(i, concrete);
}
}
contains[key][concrete] = 1
}
function add_options(name, value) {
subkey = trim(name);
if (subkey == "") {
return;
}
if (match(value, ";") > 0) {
exporting = 0;
}
split(value, args, /[ |;]*/);
for (i in args) {
key = trim(args[i]);
if (key != "") {
print("Adding " name " to " key);
options[key][subkey] = 1
if (concrete[key]) {
add_concrete(subkey, key);
}
}
}
}
抱歉,同时做饭。因为你 post 不多,所以没有太多工作要做,但没有 "initialization":
$ awk 'BEGIN {
options[key] = 0;
delete options[key];
# options[key][1] # cant see me
split("",options[key]);
}'
awk: cmd. line:5: fatal: split: second argument is not an array
但是 "initialization":
$ awk 'BEGIN {
options[key] = 0;
delete options[key];
options[key][1] # can see me
split("",options[key]);
}'
$_ # see this cursor happily blinking without any error
我正在尝试在 gawk 中创建一个关联数组的关联数组,我最初尝试的是:
options[key][subkey] = 1
然而,当它到达这一行时,我毫不客气地收到错误 fatal: attempt to use scalar 'option["Declaration"]' as an array
("Declaration" 是我的程序使用的主要键之一,尽管我认为确切的值是无关紧要的。在程序的这个特定点,没有分配 "Declaration" 条目,尽管有些条目将 "Declaration" 作为其他条目的子键,这可能是有意义的)。
因此,通过一些谷歌搜索,我发现另一个 Whosebug question 看起来可以解决我的问题,所以我将以下代码放在它上面:
if (typeof(options[key])!="array") {
options[key] = 0;
delete options[key];
split("",options[key]);
}
但是,这也不起作用,而是现在给我错误:fatal: split: second argument is not an array
我做错了什么?
编辑:请注意,我不能在这里使用基本的二维数组......对于我正在做的事情,重要的是我将一个关联数组用于另一个数组,因为我需要能够稍后识别在给定键上使用的子键。
根据下面的要求,我发布了使用关联数组的相关函数,这可能有助于澄清发生了什么。
function add_concrete(key, concrete) {
if (key == concrete) {
return;
}
if (length(options[key])>0) {
for(i in options[key]) {
add_concrete(i, concrete);
}
}
contains[key][concrete] = 1
}
function add_options(name, value) {
subkey = trim(name);
if (subkey == "") {
return;
}
if (match(value, ";") > 0) {
exporting = 0;
}
split(value, args, /[ |;]*/);
for (i in args) {
key = trim(args[i]);
if (key != "") {
print("Adding " name " to " key);
options[key][subkey] = 1
if (concrete[key]) {
add_concrete(subkey, key);
}
}
}
}
抱歉,同时做饭。因为你 post 不多,所以没有太多工作要做,但没有 "initialization":
$ awk 'BEGIN {
options[key] = 0;
delete options[key];
# options[key][1] # cant see me
split("",options[key]);
}'
awk: cmd. line:5: fatal: split: second argument is not an array
但是 "initialization":
$ awk 'BEGIN {
options[key] = 0;
delete options[key];
options[key][1] # can see me
split("",options[key]);
}'
$_ # see this cursor happily blinking without any error