不要轻易查询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这一个特性,害我调试了两个小时,唉,以后还是要小心它的关联数组。


相关文章

分类

9 Comments

ning said:

std::string的[]操作符也会在key不存在时插入key

DongHao Author Profile Page said:

但c++为map、set、string等类提供了find方法,可以纯粹查找而不影响对象。awk却没有提供查找功能,只能用[]去试探,很危险。

hero said:

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里面

DongHao Author Profile Page said:

我知道c++里面是这样的,我只是奇怪awk为什么不能比c++更高级点儿

dmjiang said:

map用下标查找的话也会插入那个key的,而value是默认值。
awk也有类似map的的查找方法的,用 if ("c" in list) 可以了

DongHao Author Profile Page said:

原来如此,多谢!

liruqi said:

可以用 if ("c" in list) 做一个条件判断。

donggua said:

水平烂,自作聪明,c++也不懂,awk也不懂。

DongHao Author Profile Page said:

“donggua”同学教训的是

留言:

关于文章

This page contains a single entry by DongHao published on 06 3, 2008 9:18 AM.

冲突世界 was the previous entry in this blog.

php数组里的数字型key is the next entry in this blog.

Find recent content on the main index or look in the 存档 to find all content.