无法读取:变量不是数组

2024-04-01

我有以下代码:

set arr1(a1) t1
set arr2(a2) t2
set l1 {}
lappend l1 arr1
lappend l1 arr2

set arr3(a3) $l1

foreach names [array names arr3] {
    set value $arr3($names)
    puts "names = $names, value = $value"
    foreach ar $value {
      if {[array exists $ar]} {
        puts "$ar is an array"
        foreach {key val} [array get $ar] {
          set d1 $ar($key)
          puts "ar key = $key value = $val "
        }
      }
    }
  }

但是当我运行 tcl 脚本时,“set d1 $ar($key)”行失败。错误消息是“无法读取“ar(a1)”:变量不是数组”。您能否建议导致错误的原因以及如何解决该错误。


当你使用语法时$ar($key),您正在查找密钥$key在数组中ar并返回其值。这就是 Tcl 的工作方式,它采用基本语言语法。但是,您正在使用ar变量来保存标量值,而不是数组(两者是完全地分离;数组不是值,但列表和字典是)。这就是您收到错误消息的原因。

要从变量中命名的数组中读取,您需要使用更长的语法,以便替换变量名称,然后从该变量中读取(Tcl 默认情况下不会为您执行此操作,因为它相当如果您没有为此做好准备,则很危险)或者您需要为指定的数组变量创建别名。

双替换通过set

set d1 [set ${ar}($key)]

这有效是因为$…实际上(在幕后)是一个别名set有一个参数。 (好吧,除了它不actually调用命令;它们都调用相同的 C API。)我们使用${...}形式来限制初始的内容$用作其变量名称。请注意,如果您将数组元素名称放入ar,你会得到奇怪的结果。

给数组或元素起别名

upvar 0 $ar theAlias
set d1 $theAlias($key)

The upvar命令将变量链接在一起,特别是与0作为它的第一个参数,它为当前作用域中的变量设置别名。通过建立theAlias作为实际数组的固定别名(由$ar),然后我们就可以像普通数组一样访问它。您还可以直接为元素添加别名:

upvar 0 ${ar}($key) theAlias
set d1 $theAlias

请注意与使用相同的语法set上面的解决方案;我们想要元素的名称,而不是读取它。 (警告:不要为全局元素添加别名env大批;耦合到系统环境变量的代码不能以友好的方式使用别名。)

使用的主要问题upvar是你无法转身theAlias返回到非别名变量(尽管您可以通过调用来重新定位别名)upvar再次)除了丢弃当前堆栈帧(对于过程体来说微不足道,对于命名空间来说也不太难namespace delete,但全局命名空间有问题,因为删除会终止整个 Tcl 解释器)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法读取:变量不是数组 的相关文章

  • 数组上的 Bash 子字符串扩展

    我有一组带有给定后缀的文件 例如 我有一组带有后缀的pdf文件 pdf 我想使用子字符串扩展来获取不带后缀的文件名 对于单个文件我可以使用 file test pdf echo file 0 4 要对所有文件执行此操作 我现在尝试 file
  • 将字符串数组添加到组合框

    我有一个组合框 我想加载一个从方法返回的字符串数组 我目前只是用 for 循环加载它 但我认为应该可以将字符串数组直接分配给组合框 我只是想改进我的代码 我已经做了一些搜索 并且看到了使用数据范围或数据源的答案 但这些似乎都不起作用 我也尝
  • 按步长值变化对数组中的数字进行分组

    我有一个像 101 107 106 199 204 205 207 306 310 312 312 314 317 318 380 377 379 382 466 469 471 472 557 559 562 566 569 在这个数组中
  • 在 Java 中循环数组的前 20 个元素

    我这里有这个循环 for int i 0 i lt prices length i if prices i gt largest largest prices i else if prices i
  • 使用 Google Apps 脚本处理数组中输入元素中的多个文件

    我有一个表单 允许从下拉列表中选择一个项目并上传文件 项目的名称和 ID 保存在电子表格文档中 适用于一个文件 但我想上传多个文件 你能帮我修改一下脚本吗 HTML 部分如下所示 div class col md 4 col sm 6 di
  • PDO 从表中获取一列到一维数组中

    我对 PDO 和让它们与 MySQL 一起工作还很陌生 我似乎在插入新数据和检索单个结果方面进展顺利 但是我坚持了下来 我有一张由配料组成的桌子 我试图将所有配料放入一个数组中 我已经直接在 SQL 中运行查询 它显示了所有结果 但是使用
  • Ada:用可变大小的数组打包记录

    我正在寻找创建一个打包记录 它可以容纳长度从 5 50 个元素不等的数组 是否可以以这样的方式来完成此操作 以便可以在不浪费空间的情况下打包记录 当我去创建记录时 我会知道数组中有多少元素 the range of the array ty
  • 获取数组中从右上角到左下角的所有对角线

    我试图存储矩阵中从右上角到左下角的所有对角线 并将它们存储在一个数组中 matrix array 2 0 0 2 3 0 0 3 3 0 0 2 0 0 0 0 预期产出 2 0 3 0 0 2 2 0 0 0 3 0 0 3 0 0 我试
  • Javascript JSON stringify 没有要包含在数据中的数字索引

    我正在尝试通过 JSON 传递非数字索引值 但没有获取数据 var ConditionArray new Array ConditionArray 0 1 ConditionArray 1 2 ConditionArray 2 3 Cond
  • SerializeArray() 给出空数组

    我正在尝试使用 seralizeArray 收获形式输入值 输入字段由具有相应价格的项目列表组成 我想根据相应的密钥对保存每个值 但不断收到错误 empty array with 0 length 我尝试了几种选择器组合 但仍然得到 如何才
  • 从数组中输入多个数字,每个数字检查是否为整数

    每个人 我希望有人能帮我弄清楚C语言的一些东西 这是我第一次认真地做IT方面的作业 我没有经验 而且我正在电子学习中学习 所以老师的帮助不是很好 我需要用C语言开发控制台应用程序 用户需要输入10个整数 如果插入的数字不是整数 需要输出错误
  • C语言中的array、&array、&array[0]有什么区别? [复制]

    这个问题在这里已经有答案了 在学习C语言中的数组和指针时 我很困惑 为什么ch ch ch 0 彼此相等 而sptr sptr sptr 0 却不相等 这是我的源代码 int main void char ch 7 1 2 3 4 5 6
  • C# 的 xml 序列化中是否有一个属性可以跳过空数组?

    C 的 xml 序列化中是否有一个属性可以跳过空数组 这将提高 xml 输出的可读性 好吧 你也许可以添加一个ShouldSerializeFoo method using System using System ComponentMode
  • 在 Swift 中初始化空字典数组

    我正在尝试在 Swift 中初始化空数组 对于字符串数组来说 这非常简单 var myStringArray String myStringArray a myStringArray b gt a b 对于整数 var myIntArray
  • 从 Redux 状态删除一个项目

    我想知道如果可能的话你是否能帮我解决这个问题 我正在尝试从 Redux 状态中删除一个项目 我已经传入了用户点击的项目的IDaction data进入减速机 我想知道如何匹配action data使用 Redux 状态中的 ID 之一 然后
  • 从多维数组中删除多个值

    我有一个来自 WordPress 的数组get posts 功能 posts array 15 0 gt object WP Post 285 24 ID gt int 253 post author gt string 1 1 post
  • 从字节数组中删除多余的“空”字符并转换为字符串[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我已经为此工作了一段时间 但在这里没
  • 将字符串转换为字节数组时会发生什么

    我认为这是一个新手类型的问题 但我已经很理解了 我可以找到很多关于如何用各种语言将字符串转换为字节数组的帖子 我不明白的是逐个字符地发生了什么 据我所知 屏幕上显示的每个字符都由一个数字表示 例如它的 ascii 代码 我们现在可以坚持使用
  • JavaScript 数组 every 和 some 之间的区别

    我看到在给定的测试中两者都返回 true 或 false https developer mozilla org en US docs Web JavaScript Reference Global Objects Array some h
  • 无需递归即可展平多个嵌套数组的数组 - javascript

    也许这是一个愚蠢的问题 但我无法意识到是否可以在不使用递归的情况下展平多维数组 我用递归编写了一种解决方案 function transform arr var result arr forEach flatten function fla

随机推荐

  • PHP DOTNET 地狱

    我是 PHP 的新手 今天我发现DOTNET http php net manual en class dotnet php class 所以我学习了手册 上网寻找一些例子 最后编写了我的测试应用程序 使用 Framework 4 0 Cl
  • PHP 初学者之类继承

    class User public company name class Employer extends User public fname public sname 这是我创建的 test php 我已经包含了类文件 employer
  • autoreleasepool 未在此范围内声明错误

    我的项目是 XCode 4 2 该项目编译为常规调试版本 但是当我将构建类型更改为分析 我想分析内存使用情况 时 我从这个 Objective C C 类中收到错误 Volumes mchinen scm Voicer FilterAudi
  • PDO、Mysql 和本机准备好的语句

    到目前为止我对 PDO 的理解是 PDO 将在可以的地方使用真正的准备好的语句 在不能的地方模拟它们 我还了解到 就 mysql 而言 如果您正在与支持它们的 mysql 版本进行通信 则将使用真正准备好的语句 事实上 MySQL PDO
  • wget :在发送后数据之前获取字段信息

    我使用 wget 以及 post data 和 save cookies 选项成功地通过了网站的登录表单 现在我尝试填写网页的某些字段 然后提交 问题是 网页上有一个 图灵 隐藏字段 每次都有不同的值 我尝试的是打开网页 加载我的cooki
  • 在无形状 HMap 中添加或修改值

    有谁知道我如何在无形的 HMap 中添加或修改值 我在 HMap 定义中看到的唯一函数是 get 看起来它正在创建一个新地图并添加 k v tuple 同上 我怀疑我需要使用镜头吗 shapeless HMap是不可变的 它是一个包装器 具
  • ruby 中的简单解析[重复]

    这个问题在这里已经有答案了 可能的重复 Ruby 中解析 HTML 文档的方法 https stackoverflow com questions 2554909 method to parse html document in ruby
  • 给定一个邻接矩阵,如何使用 matplotlib 绘制图形?

    我有一个由其邻接矩阵 一个 numpy 数组 描述的无向图 我想绘制它 并将顶点放置在 n 正多边形中 这段代码的工作原理 n adyacency mathix shape 0 axis np linspace 0 2 np pi n en
  • 尝试暴力破解平均密码/非侵入性但有意义的限制的次数?

    关于通过应用限制来防止暴力破解 Web 服务的密码 SO 有几个有用的答案 但我找不到任何好的数字 而且我在这方面缺乏专业知识 所以问题是 通常需要多少次尝试才能暴力破解 6 个或更多字符的平均密码 没有可能有帮助的其他知识 但考虑到密码可
  • 错误:找不到 com.google.gms:google-services:1.0。在 android studio 的 build.gradle 中添加 google 服务插件时

    我正在我的 Android 应用程序上集成 Google 的 OAuth 登录 遵循tutorial https developers google com identity sign in android start integratin
  • 从 API 下载 AngularJS CSV 文件

    我有一个管理控制面板 管理员用户可以在其中设置一些选项 然后单击按钮来运行报告 该报告应向用户返回 CSV 文件下载提示 我在用ui router and resource服务 响应标头 mime 类型设置正确 但 CSV 文件以文本形式返
  • ArrayList 的 contains() 方法如何评估对象?

    假设我创建一个对象并将其添加到我的ArrayList 如果我随后创建另一个具有完全相同的构造函数输入的对象 contains 方法评估两个对象是否相同 假设构造函数对输入没有做任何有趣的事情 并且存储在两个对象中的变量是相同的 ArrayL
  • 如何基于Netbeans的模板同时创建多个文件到不同的包中?

    我对 Netbeans 模板有一点问题 目前 我只能从 Netbeans 模板一次创建一个文件 但我想做的是 选择一个模板 让 Netbeans 立即创建所有需要的文件 类似于 javafx fxml 模板 不同之处在于我想要不同包中的文件
  • HTML5 音频标签可以在哪些下载?

    我使用了 HTML5 的音频标签 并放置了 1 个下载按钮 可以通过我们直接下载为 mp3 文件的音频标签提供的任何功能
  • 如何在 Tkinter 中将参数传递给 Button 命令?

    假设我有以下内容Button在 Python 中使用 Tkinter 制作 import Tkinter as Tk win Tk Toplevel frame Tk Frame master win grid row 1 column 1
  • 如果由 maven-assemble-plugin 构建,则手动附加主要工件

    我在构建 Maven 项目时遇到问题 我有一个生产要求确定性的jar 文件 这些文件在不同的构建和版本之间必须是二进制一致的 以防这些构建之间没有源代码更改 为此 我使用了本文 http gary rowe com agilestack 2
  • 如何更改 Xcode 项目名称

    我已经在 iPhone 的 Xcode 中开发了我的应用程序 一开始我只是在没有 secnec 的情况下命名它 现在我想更改我的应用程序名称 我已将旧应用程序名称替换为新名称 因为我在应用程序中找到了该名称 但它仍然给我一个错误 桌面 新名
  • 将泛型 ienumerable 转换为 arraylist

    我需要将 linq 查询从通用 ienumerable 转换为 arraylist ArrayList myArrayList new ArrayList var b from myObj in myCollection select ne
  • Spring Boot抽象自动配置问题

    使用 spring boot 一起运行 activiti 和 web sockets 时出现以下错误 Parameter 0 of method springAsyncExecutor in org activiti spring boot
  • 无法读取:变量不是数组

    我有以下代码 set arr1 a1 t1 set arr2 a2 t2 set l1 lappend l1 arr1 lappend l1 arr2 set arr3 a3 l1 foreach names array names arr