不要轻易查询awk中的关联数组
BEGIN {
list["a"]="apple";
list["b"]="banana";
if(list["c"]=="cat")
{
print "Oh! A cat!";
}
}
END{
for(var in list)
{
print var","list[var];
}
}
输出结果是:
a,apple
b,banana
c,
我并没有向关联数组 list 中写入“c"这个key,但它却在里面,而且没有对应的value。可见awk中的关联数组只要你访问了,它就把key塞了进去,这一点与c++的map不同。
就awk这一个特性,害我调试了两个小时,唉,以后还是要小心它的关联数组。
list["a"]="apple";
list["b"]="banana";
if(list["c"]=="cat")
{
print "Oh! A cat!";
}
}
END{
for(var in list)
{
print var","list[var];
}
}
输出结果是:
a,apple
b,banana
c,
我并没有向关联数组 list 中写入“c"这个key,但它却在里面,而且没有对应的value。可见awk中的关联数组只要你访问了,它就把key塞了进去,这一点与c++的map不同。
就awk这一个特性,害我调试了两个小时,唉,以后还是要小心它的关联数组。
相关文章
- fedora 9 小集 - 01 05, 2009
- 多线程调试 - 12 17, 2008
- fedora 9 试用 - 12 05, 2008
std::string的[]操作符也会在key不存在时插入key
但c++为map、set、string等类提供了find方法,可以纯粹查找而不影响对象。awk却没有提供查找功能,只能用[]去试探,很危险。
stl 中的map也是这样的,你可以参考stl的源码
// [23.3.1.2] element access
/**
* @brief Subscript ( @c [] ) access to %map data.
* @param k The key for which data should be retrieved.
* @return A reference to the data of the (key,data) %pair.
*
* Allows for easy lookup with the subscript ( @c [] ) operator. Returns
* data associated with the key specified in subscript. If the key does
* not exist, a pair with that key is created using default values, which
* is then returned.
*
* Lookup requires logarithmic time.
*/
mapped_type&
operator[](const key_type& __k)
{
// concept requirements
__glibcxx_function_requires(_DefaultConstructibleConcept)
iterator __i = lower_bound(__k);
// __i->first is greater than or equivalent to __k.
if (__i == end() || key_comp()(__k, (*__i).first))
__i = insert(__i, value_type(__k, mapped_type()));
return (*__i).second;
}
//在/usr/include/c++/4.1.1/bits/stl_map.h里面
我知道c++里面是这样的,我只是奇怪awk为什么不能比c++更高级点儿
map用下标查找的话也会插入那个key的,而value是默认值。
awk也有类似map的的查找方法的,用 if ("c" in list) 可以了
原来如此,多谢!
可以用 if ("c" in list) 做一个条件判断。
水平烂,自作聪明,c++也不懂,awk也不懂。
“donggua”同学教训的是