如何從列表中獲取元素

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