如何從列表中獲取元素
- 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語句實現對變數賦值,其中所需值來自於一個給定的列表。