https://www.cnblogs.com/yeungchie/ 函數功能 Perl 中 shift 函數可以返回列表的第一個元素,並將後續所有元素向前移位( 索引值減 1 )。輸入可選,預設為 @_ 或者 @ARGV。 my @foo = qw( 1 2 3 4 ); say shift @f ...
https://www.cnblogs.com/yeungchie/
函數功能
Perl 中 shift
函數可以返回列表的第一個元素,並將後續所有元素向前移位( 索引值減 1 )。輸入可選,預設為 @_
或者 @ARGV
。
my @foo = qw( 1 2 3 4 );
say shift @foo;
# 1
say @foo;
# 234
在某些版本的 Tcl 中函數 lshift
可以實現類似效果,或者使用 struct::list
包:
package require struct::list
set foo { 1 2 3 4 }
puts [::struct::list shift foo]
# 1
puts $foo
# 2 3 4
但某些 EDA 工具中內置的 Tcl 版本較舊,或者做了精簡,無法使用上面提到的方法,所以下麵自己來實現一下。
Tcl 實現
proc shift { sym } {
upvar 1 $sym foo
if { ! [info exists foo] } {
error "can't read \"$sym\": no such variable"
}
set foo [lassign $foo[unset foo] var0]
return $var0
}
測試
列表迭代
set a {3 1 2 5 4}
# 3 1 2 5 4
shift a
# 3
shift a
# 1
puts $a
# 2 5 4
迴圈中應用
set a {1 2 {} 4 {}}
# 1 2 {} 4 {}
while { [llength $a] } {
puts [shift a]
}
# 1
# 2
#
# 4
#