Tcl学习笔记(四)——流程控制、过程、命名空间、访问文件

1. 流程控制

if命令

        if命令后跟两个参数:表达式、待执行的Tcl脚本。if命令中的每一个左大括号都必须与它前一个字符同行。

        有elseif和else可选子句,使用时与if中第二个参数的右大括号放在同一行。

switch命令

        switch命令利用一个给定值与多个模式进行匹配,执行匹配成功的TCL脚本,有两个参数:待检测的值、一个或多个元素对的列表。每个元素对的第一个元素是匹配模式,第二个元素是匹配成功后需要执行的脚本。

        switch同样有三种匹配方式-exact(默认,严格的字符串匹配)、-glob(string match命令下的匹配)、-regexp(正则表达式匹配)。匹配方式后的“--”表明选项结束,后为待检测的值。switch命令的列表参数最好放在大括号中,避免变量值换导致错误。

        如果switch命令的最后一个模式为default,则当与其他模式都无法匹配值,就会执行default对应的脚本。

        如果匹配模式对应的脚本只是一个短划线“-”,那么switch命令就会认为该模式与下一个模式对应的脚本相同,采用此方法可将对应脚本相同的多个不同匹配模式捆绑在一起。

switch命令中的注释只能添加到匹配模式对应的脚本中,否则会报错。

while命令

        while循环命令有两个参数:由表达式构成的循环条件、由Tcl脚本构成的循环体。在执行时,while命令先处理表达式,然后根据表达式的结果判断是否执行循环体。如果表达式的值为真(非0、yes或true),则执行循环体。这个过程不断重复,直至表达式的结果为假(0、no或false),返回一个空字符串。

        continue和break是循环控制命令,continue命令只结束本次循环,break命令结束整个循环。

for命令

        for循环命令有四个参数:初始化变量、包含循环变量的表达式(用于判断循环是否执行)、更新循环变量、由Tcl脚本构成的循环体。for命令先运行第一个参数中的脚本,随后处理第二个参数值的表达式,如果表达式为真,则运行第四个参数中的Tcl脚本,之后执行第三个参数中的脚本进行循环变量的更新,更新完毕后再处理第二个参数中的表达式,不断循环直到表达式的结果为假。

        for循环也可以嵌套。

source命令

        source命令用于读取一个Tcl文件,并将文件内容作为Tcl脚本运行,只有一个参数指定要读取的文件名,可以用绝对路径指定,也可以用相对路径指定。source 的返回值就是运行文件内容的返回值,即文件中最后一条命令的返回值。

2. 过程

        Tcl的过程是由一系列命令构成的代码块,用于执行特定的任务,可分为Tcl自定义的内建(Built-in)过程(如power()、exp()等)和用户定义的过程。过程由命令proc创建,有三个参数:过程名、参数名列表、构成过程块的Tcl脚本,过程块通过return返回该过程的值。

过程的参数名列表和返回值

        proc的参数名列表可以为空、一个参数名、多个参数名或参数名的个数为变量。参数名列表支持可变个数的参数,将特殊参数名args放在参数名列表的最后一个,args是一个可变长度的列表。

        在创建过程中,Tcl允许给参数设置默认值,但要求带默认值的参数名与对应的参数值出现在参数名列表的最后位置,除非最后一个参数名为args。参数名在参数名列表里的顺序为无默认值的参数名、带默认值的参数名和特殊参数名args。

        当过程中没有使用return命令,返回值为过程块中最后一条命令的返回值;如果使用了return,返回值由return决定,并且可以将返回的多个值放在列表中,以列表的形式返回。

局部变量与全局变量

        局部变量是过程块中定义的变量,其作用域仅限于过程块内,生命周期随着过程的返回而结束;全局变量是过程之外定义的变量,它们长期存在,仅在明确被删除后才消失。不同过程块中的局部变量可以有相同的变量名,局部变量也可以和全局变量同名,但它们是不同的变量。

        如果需要在过程中使用全局变量,则可以使用global命令实现。该命令会把它的第一个参数作为全局变量的名称,从而将过程中对这些变量名的引用定向到全局变量。可以在过程中的任何时候调用global命令,一旦调用,就会一直生效,直到过程返回。

如果需要在过程块中使用全局变量,则建议将变量名用大写字母的方式命名。

upvar命令

模拟引用

        全局变量可通过局部变量的引用来更新,用到命令upvar,有两个参数:全局变量名、局部变量名,即局部变量将引用全局变量。

数组用作参数或返回值

        upvar命令可以将数组名传递给过程,使得在过程中可以访问数组或返回数组

给变量起别名

3. 命名空间

创建命令空间

        命名空间是变量和过程的集合,使得Tcl能对这些变量和过程进行分组管理。不同的命名空间中同名变量或过程是相互独立的。

        命令namespace eval用于创建命名空间,有两个参数:命名空间名、命名空间内容(命名空间变量和过程)。过程也可以在命名空间外定义,但是需要在过程名前使用命名空间分隔符(::),表明该过程属于哪个命名空间,也可以用命名空间分隔符访问变量和过程。

        命名空间可以嵌套,在已有的命名空间下再次创建命名空间。

        命名空间为树状结构,根为全局命名空间,直接以::开头访问的是全局命名空间。

        命令namespace children可返回指定命名空间的子空间,命令namespace parent可返回指定命名空间的父空间。命令namespace exists用于确定指定命名空间是否存在,存在返回1、否则返回0。命令namespace qualifiers后跟随一个参数,可返回该参数中最后一个命令分隔符之前的所有字符。命令namespace tail后跟随一个参数,可返回该参数中最后一个命令分隔符之后的所有字符。命令namespace delete删除全局命名空间中已存在的子命名空间。

创建命令空间变量及作用域

        命令variable可创建命名空间变量并对其初始化,同时可使命名空间中的过程访问该变量。

        命令variable可将数组设置为命名空间变量,但不能对其进行初始化,需要用array set进行初始化,也可使数组对过程可见。

        命名空间变量的作用域仅限于对其定义的命名空间,并且全局变量、命名空间变量和局部变量可以同名。对于嵌套的命名空间,命名空间变量也不可向下传递。

访问命令空间变量

有三种方法访问命名空间变量:

1.通过命名空间分隔符访问并改变其初始值

2.通过命令upvar引用命名空间变量,给其起别名,并通过给别名赋值的方式改变命名空间变量的值

3.命令namespcae upvar给用命名空间变量,有三个参数:命名空间名、该命名空间中的变量名、给该命令空间变量的别名

        命令namespace还可以使一个命名空间引用另一个命名空间的变量。

从命令空间导入和导出命令

        命令namespace export可将命令空间中的命令导出,命令namespace可将命令空间中的命令导入。

        命令namespace forget可以遗忘已经导出的命令;命令info command可用于查询指定命名空间包含的所有命令;命令namespace origin可用于查询导入命令的原始来源。

创建集合命令

        通过命令namespace ensemble create创建集合命令,创建后在使用时可以不用再添加分隔符,还可以使用缩写形式,只要缩写后的命令对应的完整命令是唯一的。

4. 访问文件

操纵文件名和目录名

        对于文件目录,Windows系统采样反斜线、Linux系统采用正斜线,为了避免Tcl中的反斜线替换,因此在Windows系统使用Tcl时统一使用正斜线作为文件目录分隔符。

        Tcl中的file是一个包含多个选项的通用命令,file dirnmae返回文件名路径;file extension返回文件拓展名;file nativename返回原生格式的文件名;file rootname返回除拓展名之外的部分;file tail返回文件的最后一个部分,即最后一个子目录下的文件名;file split可将文件名安正斜线"/"所在位置进行分割并返回各部分字符串;file join是file split的逆过程。

当前工作目录和目录内容

        Tcl支持文件的绝对路径和相对路径,pwd(print working directory)不需要任何参数,返回当前目录的绝对路径;cd(change directory)有一个参数,将当前目录切换到该参数指定的目录;glob获取当前工作目录下的内容,该命令后跟随一个或多个模式参数,返回与这些模式匹配的文件夹或文件名列表。

        glob可以跟随选项-types,-types的可选值有多种,如d和f。d表示目标(文件夹),f表示文件。对于文件还可以提供访问授权标志:r表示读取授权,w表示写入收起,x表示执行授权,hidden表示隐藏一级文件,readonly表示只读授权。

处理磁盘上的文件

        命令file mkdir(make directory)可在当前工作目录下创建一个新的目录,该目录的名字由file mkdir之后的参数决定,如果指定目录名称已经存在,则命令不会进行任何操作,也不会返回任何错误信息。

        命令file delete用于删除指定的文件或目录,如果目录为空,则file delete就会产生错误信息,可添加-forece选项删除非空目录。

        命令file copy将源文件复制到目标文件,有两个参数:源文件名称、目标文件名称,如果目标文件已存在就会报错,可使用-force覆盖已存在的目标文件。file copy还可以将指定的多个文件复制到目标目录中。

        命令file rename可将指定的文件或目录重命名,有两个参数:源文件或源目录名、目标文件或目标目录名称,如果目标名称已存在,则会报错,可通过-force覆盖已存在的文件。如果目标名称指向了另一个目录,则file rename会把文件移动到新目录下。


 

获取文件信息

        Tcl提供了一些命令获取文件信息,格式通常为file option name,file exists查看指定的文件或目录是否存在,存在为1否则为0;file isfile判断指定的内容是否为文件,是为1否为0;file isdirectory判断指定的内容是否为目录,是为1否为0;file type查看指定内容的类型,返回值根据内容的不同可分为file、directory、socket;file readable、writable、executable,当指定文件存在且当前用于有执行指定操作的权限时返回1,否则返回0;file stat可一次性得到文件的各种信息,有两个参数:指定的文件名或目录名、数组(用于存储文件信息)。

        选项stat可一次性得到文件的各种信息,有两个参数:指定的文件名或目录名、一个数组(用于存储文件信息)

关键字
atime最后一次被访问的时间
ctime最后一次改变状态的时间
dev文件的群组识别符
gid文件在设备中的序列号
ino文件在设备中的序列号
mode文件模式位
mtime最后一次被修改的时间
nlink链接到文件的链接数量
size文件大小,单位为字节
uid拥有文件的用户标识
type根据给定的文件名返回文件类型

文件的读写

        Tcl可通过命令open打开一个文件,有两个参数:文件名、访问模式,返回值是给定文件的文件描述符,可被其他命令使用。

访问模式含义
r只读模式。指定文件必须存在。如果不指定访问模式,则此模式为默认模式。
r+可读写模式。指定文件必须存在。
w只写模式。如果文件存在,则删除文件中的全部内容;如果文件不存在,则创建一个空的文件夹。
w+可读写模式。如果文件存在,则删除文件中的全部内容;如果文件不存在,则创建一个空的文件夹。
a只写模式。将初始访问位置设为文件尾,故新写入的内容将添加到文件原有位置后,除非重新设置了访问位置。如果文件不存在,则创建一个空的文件夹。
a+可读写模式。将初始访问位置设为文件尾,故新写入的内容将添加到文件原有位置后,除非重新设置了访问位置。如果文件不存在,则创建一个空的文件夹。

        命令read读取文件,有一个或两个参数:open命令的返回值、读取量(以字节为单位),两个参数时用于获得文件大小。

        命令close关闭已打开的文件,其后跟随open命令的返回值。

        read是按块操作,当文件较大时,会占用较大的存储空间,因此Tcl还有按行读取文件内容的方式。命令gets有两个参数:open命令的返回值、用于存储文件行内容的变量,返回值为改行内容的大小(以字节为单位),当读到文件末尾时,gets返回-1。gets一个参数:open命令的返回值,此时返回获取文件的行内容。

        命令eof(End of File),一旦读取到文件末尾,返回1。

        命令puts向文件中写入数据,有两个参数:open命令的返回值、待写入的数据,可用-nonewline阻止换行。

处理CSV文件

        CSV(Comma-Separated Values,字符分隔值)文件是一种以纯文本形式存储表格数组的文件。纯文本意味着该文件是一个字符序列,由任意多个记录组成,记录间以换行符分割;记录由字段组成,字段之间通常以逗号作为分隔符。

Tcl提供了处理CSV文件的包:

        命令csv::split后跟随一行CSV格式的内容,可指定分隔符,在未指定分隔符的情况下,默认分隔符为逗号。

        命令csv::read2matrix将CSV文件中的内容读入到指定到指定的矩阵中,通过对矩阵进行行操作一次读取每行的内容。

        命令csv::read2queue可将CSV文件中的内容读入到一个队列中,每一行内容构成队列中的一个元素,利用队列先入先出的特性从中取出这些元素,直到队列为空,实现对CSV文件每行内容进行处理的功能。

        命令csv::join实现以CSV格式写入数据并生成CSV文件的目的,命令后跟随一个列表(被认为是CSV的一行内容),默认的分隔符是逗号,也可指定分隔符。

        命令csv::joinlist完成写CSV文件操作,命令后跟随一个列表,此列表通常是一个嵌套列表,每个子列表构成CSV文件的一行内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3018764.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Py脚本_文件分类

最近发现通过Edge和chrome或者其他浏览器下载的文件都存放在一个地方就很繁琐,于是翻找以前的脚本来归纳这些文件,虽然有IDM下载独有会自动分类,但是相信很多同学都在一个文件里找文件,这次就写个Py脚本来实现这个功能。 # -*- c…

无人零售,重塑购物新纪元

在这个快节奏的时代,科技的每一次跃进都在悄无声息地改变着我们的生活方式。而今,无人零售正以雷霆之势,颠覆传统购物模式,为我们带来前所未有的便捷与智能体验。想知道无人零售如何彻底改变我们的购物方式吗?跟随我&a…

西安银行效益口碑双降:不良率连增,新董事长梁邦海能否救火?

撰稿|行星 来源|贝多财经 近日,西安银行(SH:600928)方面终于传来了新任掌门人的音讯。该行在2023年财报中正式宣布,董事会选举梁邦海为董事长,在监管部门核准梁邦海的任职资格后,梁邦海将不再担任该行行长…

【Java基础】Maven继承

1. 前言 Maven 在设计时,借鉴了 Java 面向对象中的继承思想,提出了 POM 继承思想。 2. Maven继承 当一个项目包含多个模块时,可以在该项目中再创建一个父模块,并在其 POM 中声明依赖,其他模块的 POM 可通过继承父模…

【源码】[完美接单]亲测双端获取通讯录、相册、短信定位源码

源码介绍 无hb源码,需要反编译。 此款修复了逻辑,现在全部能获取。包括华为鸿蒙。 安卓可获取:短信定位相册通讯录 IOS可获取:定位相册通讯录 源码截图 CD:获取方式联系小编 微信:uucodes 公众号&…

[C++核心编程-04]----C++类和对象之封装

目录 引言 正文 01-类和对象简介 02-封装简介 03-封装的意义 04-封装案例之设计学生类 05-封装的权限控制 06-struct和class的区别 总结 引言 在C中,类和对象是面向对象编程的基本概念,而封装则是面向对象编程的三大特征之一&a…

FastStone Capture 简介与常规用法

FastStone Capture 是一款功能强大的屏幕截图和视频录制软件,它提供了多种捕捉模式,包括全屏、窗口、对象、矩形区域、自由手绘区域等。除了基本的截图功能,FastStone Capture 还支持图像编辑、滚动截图、屏幕录像、颜色拾取、屏幕放大等高级…

【k8s多集群管理平台开发实践】十一、client-go实现读取k8s的事件信息

文章目录 简介 一.k8s读取k8s事件1.1.controllers控制器代码1.2.models模型代码 二.路由设置2.1.路由设置 三.前端代码5.1.列表部分html代码 四.完整代码4.1.控制器event.go的完整代码4.2.模型eventModel.go的完整代码 五.效果图 简介 本章节主要讲解通过client-go实现读取k8s事…

2023年度合肥市优秀知识产权服务机构评选申报主体条件、材料和时间程序须知

一、申报主体 在合肥市行政区域内登记注册的知识产权服务机构, 二、申报条件 (一)在合肥市登记注册时间满1年,营业执照经营范围包含知识产权代理、服务等相关内容; (二)在全国专利代理信息公示平台进行备案; (三)有稳定的专业服务人才队伍和服务对象…

21物联1班常用网络扫描

网络扫描 1.网络扫描概述2.网络扫描步骤及分类具体步骤 1.网络扫描概述 网络安全扫描技术是一种基于Internet远程检测目标网络或本地主机安全性脆弱点的技术。通过网络安全扫描,系统管理员能够发现所维护的Web服务器的各种TCP/IP端口的分配、开放的服务、Web服务软件…

量化交易:财务选股RSRS择时的策略

哈喽,大家好,我是木头左! 引言 本文将介绍一种结合财务指标选股和RSRS(Risk-Adjusted Return to Strength Ratio)择时的策略,旨在帮助投资者在复杂的市场环境中做出更明智的决策。 感兴趣的朋友&#xff0…

前端 | 自定义电子木鱼

文章目录 &#x1f4da;实现效果&#x1f4da;模块实现解析&#x1f407;html&#x1f407;css&#x1f407;javascript &#x1f4da;实现效果 &#x1f4da;模块实现解析 &#x1f407;html 搭个框架<!DOCTYPE html> <html lang"en"> <head>&l…

搭建电商ERP系统电商独立站最实用的电商API商品数据采集接口||电商API接口接入

通常搭建电商独立站需要接入的商品数据接口包括&#xff1a; 1. 商品信息接口&#xff1a;包括商品基本信息&#xff08;名称、描述、价格等&#xff09;、图片信息、库存信息、分类信息等。 2. 库存信息接口&#xff1a;用于同步更新商品的库存情况&#xff0c;保证实时性…

同城组局同城活动找搭子小程序JAVA源码面芽组局的实现方案

功能概述 基于微信小程序开发的一款软件&#xff0c;支持用户动态发布、私信聊天关注、礼物充值打赏、发起活动组局、用户报名参与、支持商家入驻&#xff0c;对接广告功能等。 活动发布&#xff1a;用户可以在平台上发布各种类型的活动&#xff0c;如户外徒步、音乐会观赏、…

森林消防新利器:高扬程水泵的革新与应用/恒峰智慧科技

随着全球气候变化的加剧&#xff0c;森林火灾的频发已成为威胁生态安全的重要问题。在森林消防工作中&#xff0c;高效、快速的水源供给设备显得尤为重要。近年来&#xff0c;高扬程水泵的广泛应用&#xff0c;为森林消防工作带来了新的希望与突破。 一、高扬程水泵的技术优势 …

java项目跑不起来 端口已被使用

背景 Springboot项目跑不起来&#xff0c;原因端口被占用。 解决方法 在 Windows 环境下&#xff0c;你可以按照以下步骤来查看某个端口被占用的情况&#xff0c;并停止相应的进程&#xff1a; 查看所有端口占用情况&#xff1a; 按下 Win R 键&#xff0c;打开运行窗口。…

中霖教育:考下注册会计师能从事哪些工作?

考下注册会计师能够从事哪些工作&#xff1f; 1 企业从事会计和财务工作 大部分的CPA持证人&#xff0c;会在企业里&#xff0c;从事会计和财务工作。但是能拿到多少薪资&#xff0c;也要看你所进入的平台。如果是小企业&#xff0c;实力一般&#xff0c;也就几干块工资。如果…

HTTP免费升级到HTTPS攻略

HTTPS就是在HTTP的基础上加入了SSL&#xff0c;将一个使用HTTP的网站免费升级到HTTPS的关键就是申请一个免费的SSL证书 具体步骤如下 1 获取免费SSL证书 国内的JoySSL 提供不限量免费的SSL/TLS证书。根据自己的需求选择证书类型&#xff08;登录JoySSL官网&#xff0c;创建账号…

收银系统源码--什么是千呼智慧新零售系统?

千呼智慧新零售系统是一套针对零售行业线上线下一体化收银系统。给门店提供线下称重收银、o2o线上商城、erp进销存、精细化会员管理、丰富营销插件等一体化解决方案。多端数据打通&#xff0c;实现线上线下一体化&#xff0c;提升门店工作效率&#xff0c;实现数字化升级&#…

详细介绍一下PointPillars算法的网络结构

PointPillars是一种用于3D目标检测的算法&#xff0c;它主要使用了点云数据和深度学习模型。 PointPillars算法的网络结构主要可以分为三个主要阶段&#xff1a; Pillar Feature Net&#xff08;点云特征处理网络&#xff09;&#xff1a;此阶段的主要任务是将输入的点云数据转…