如何从列表中获取元素

  • 2019 年 10 月 30 日
  • 笔记

思考一下:

对于URAM是否也可以通过设置独立的地址空间将其配置为两个独立的单端口RAM?

观察URAM的物理管脚,不难发现A/B端口都有相应的地址、使能、读写控制信号。与BRAM不同的是URAM的读写使能信号是同一个管脚RDB_WR_A/B,其为0时执行读操作,为1时执行写操作,这意味着一旦A/B端口独立,同一端口的读写操作就无法同时发生,因此,如果采用上一篇文章中介绍的方法将其配置为两个独立的单端口RAM,其读写行为与常规的单端口RAM是不同的,进一步而言,此时的读写行为类似于NO_Change模式。

有两种方法可用于从列表中获取元素,这涉及到两个命令,分别是lindex和lassign。不难发现,列表(list)的相关命令都是以字母l(大写为L)开头的,例如之前文章提到的list、llength、lrange、lappend和lset。

方法1:lindex

lindex之前已经介绍过。该命令接收两个参数:列表变量名和索引号。例如:

方法2:lassign

上述操作可以通过lassign快速完成。lassign接收至少两个变量,第一个是列表变量,第二个是其他变量,也就是将列表中的元素分配给这些变量。例如:

可以看到此时lassign比lindex要快捷很多。但需要注意的是lassign是要把所有元素依次分配给这些变量,这就会出现两种例外情形。

情形1:列表元素的个数比待分配变量个数多

例如,上例中只保留待分配变量x和y,可以看到lassign会返回一个值c,这个值其实就是列表中未分发的元素。而变量x和y的值与上例保持一致。

情形2:列表元素的个数比待分配变量个数少

例如,这里增加一个变量t,可以看到最终t的值为空字符串。

综上所述,可以看到在使用lassign时要格外小心,确保变量个数与列表长度一致,或变量个数小于列表长度,否则会出现待分配变量最终被赋值为空字符串的情形。

思考一下:

如何用foreach语句实现对变量赋值,其中所需值来自于一个给定的列表。