[ Tcl ] 如何实现类似 Perl 中 shift 函数的效果

打印 上一主题 下一主题

主题 987|帖子 987|积分 2961

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
https://www.cnblogs.com/yeungchie/
函数功能

Perl 中 shift 函数可以返回列表的第一个元素,并将后续所有元素向前移位( 索引值减 1 )。输入可选,默认为 @_ 或者 @ARGV。
  1. my @foo  = qw( 1 2 3 4 );
  2. say shift @foo;
  3. # 1
  4. say @foo;
  5. # 234
复制代码
在某些版本的 Tcl 中函数 lshift 可以实现类似效果,或者使用 struct::list 包:
  1. package require struct::list
  2. set foo { 1 2 3 4 }
  3. puts [::struct::list shift foo]
  4. # 1
  5. puts $foo
  6. # 2 3 4
复制代码
但某些 EDA 工具中内置的 Tcl 版本较旧,或者做了精简,无法使用上面提到的方法,所以下面自己来实现一下。
Tcl 实现
  1. proc shift { sym } {
  2.     upvar 1 $sym foo
  3.     if { ! [info exists foo] } {
  4.         error "can't read "$sym": no such variable"
  5.     }
  6.     set foo [lassign $foo[unset foo] var0]
  7.     return $var0
  8. }
复制代码
测试

列表迭代
  1. set a {3 1 2 5 4}
  2. # 3 1 2 5 4
  3. shift a
  4. # 3
  5. shift a
  6. # 1
  7. puts $a
  8. # 2 5 4
复制代码
循环中应用
  1. set a {1 2 {} 4 {}}
  2. # 1 2 {} 4 {}
  3. while { [llength $a] } {
  4.     puts [shift a]
  5. }
  6. # 1
  7. # 2
  8. #
  9. # 4
  10. #
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

小秦哥

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表