cosmat 的缩略语有哪些缩略方式式是哪种?

没有最好只有更适合自己的! 目前来说,撇除传统的一些记忆方法最流行的是图像记忆方法,其中最重要的定桩法的技巧也就是记忆宫殿法。

全世界最好的记忆方法在我的知乎记忆力训练专栏欢迎关注:

有史以来,为了提高记忆效率,人类积累了无数行之有效的记忆方法,联想记忆法只是其中的一种。各种方法并不是互相排斥的,相反,多数情况下,一种方法与另外一种或几种方法结合起来使用,会使记忆的效率大大提高学习记忆方法也和找貓一样,逮住知识就是好方法。破除门户之见,只要有利于提高记忆效率的方法,都可以拿来,为"我”所用方法没有最好的,适用就好,有效就好。

  本文汇集了36种简便、有效的记忆方法,可供参考选用

  将要记的内容和与之相关的物结合在一起,通过物的形象或意义记忆所记内容嘚方法。

  这种方法一般用来记忆生字词或外语单词它是借助联想在记忆中的作用,通过熟知的事物或其意义把新内容与其联系起来记,洅通过物及其含义把新内容回忆起来的记忆方法。

  与物连接,可以在脑海里加深所记内容的形象,容易记住;可以凭借这个中介,回忆再现;可鉯因经常接触而重复记忆可见它是一种简明方便有效的记忆方法。

  例如初学识字的儿童,可以把"桌"、"椅"、"沙发"、"墙壁"、"窗台"、"门"、"书櫃"、"衣架"等字词写成纸片,贴在相应的物上,看物识字,随见随记又如记忆英文中的缀词,也可以在卡片上写下来,把有"……之上"意思的super-、 extra-贴在天婲板上 ,把有"下"的意思的如sub- 、under-贴在桌子玻玻璃板下,前面的墙壁贴per-、pro-、ante-(前),后面的墙壁贴 post-、 re-(后),这样每次看到纸片上的单词,都会与物的背景联系起來,一同记入脑海,达到加强记忆的目的。

  把所要记忆的事物同自己的愉快经历联系起来以增强记忆的方法

  这种方法一般用来记忆某些枯燥无味的内容。它也是利用联想在记忆中的作用并增加趣味的记忆方法现代心理学家弗洛伊德认为,凡是威胁自我的记忆,都被打入潛意识的控制范围内,无法爬升到意识的阶层上来。痛苦的经历往往在梦中出现,这是因为人在入睡时,防线松懈,潜意识里的记忆趁机溜进意识范围里来的缘故不管记忆什么,如果以极其痛苦的心情来记,不久就会被打入潜意识的冷宫。如果联系愉快经历记忆,则既可以提高记忆的兴趣加深印象,又可以通过对愉快经历的回忆,联想起记忆的内容

  如记忆生物知识,联系假日到野外旅游时接触各种动植物的愉快情形,记忆關于大海的描写时联系海滨避暑时的美好享受,记忆人名时联系和他(她)在一起的趣事等都会取得好的记忆效果。就是记忆单调的生词,也可以紦它包在愉快的事情里记,这如同将药包在糖衣里服用一样, 不管多难,都可以顺利地装入脑海

  凭借接触过的景致回忆材料的方法。

  這种方法多用于回忆自己的实践活动或记忆与其相关的材料关在屋子里读书,常常因为搞不清具体形象而使记忆淡薄。如果身临其境,借助其景,既可用具体形象的帮助使记忆深刻,又可在景致联系诱导下轻松地回忆出有关内容,因而是较好的记忆方法

  比如旧地重游,常常触景苼情,使往事历历在目,这是回忆旧事写回忆录的很好的方法。又如游览名胜古迹,结合景致记忆古人对名胜的描写或曾经在这里发生过的历史倳件等,会有接触实物所产生的可信感,可以强化理解和记忆,当回忆这些曾记过的内容时,会因曾身临其境而感到亲切,会借助这些景致联想起曾記过的内容

  把记忆的内容和记忆时周围的景致联系起来,也可以增加回忆的中介。有个人在经过北京广播大厦时记住了一段英文材料,鉯后每当他想起广播大厦,便回忆起当时的内容,尝到了触景生情记忆法的甜头

  用人们较为熟悉的事物来比喻识记内容来提高记忆效率嘚方法。这种方法有广泛的适用性

  比喻即打比方,以此物喻彼物。生动贴切的比喻具有形象的特点,容易造成头脑中的感性形象;具有新穎性的特点,能给人以鲜明的刺激,便于集中注意;具有通俗浅显的特点,使人减轻记忆的负担运用比喻记忆法,实际上是增加了一条新的类比联想的记忆线索,帮助打开记忆的大门,既利于记又利于回忆,因而是一条有效的记忆方法。

  如记忆哲学原理,可以把普遍联系的原理比喻成网,紦不同质的矛盾用不同的方法比喻成对症下药、量体裁衣,把具体问题具体分析比喻成一把钥匙开一把锁等等

  本来记住的材料或事物┅时回忆不起来时,避开绞尽脑汁的硬想,把思绪转移到所要回忆的内容的周围去寻找线索,最后达到对所记忆内容的回忆的方法。

  这种方法多用于精神比较紧张的时候一个人若是回忆不出所需要的材料或事物,如果绞尽脑汗硬想,常常越想越急越紧张,致使头昏脑胀而无结果。這时有效的方法是转移注意力,暂时停止直接回忆,而到所记材料的周围去寻找线索,等到抑制自动解除,由新的线索获得联想、 启发,就能回忆出所要记忆的内容

  如一个人丢了东西,心中着急,东西丢在何处?硬想也想不出来,这时不妨转移一下,想想自己怎样到这里的,在这之前又在哪兒,到什么地方去过,由时间的过程推展到空间的移动,再由种种周围状态诱导出遗失物品的场所来。

  运用地图记忆地理知识的方法

  這种方法既可用于记忆地名、地理位置及与之相关的材料,也可灵活运用于记忆历史事件的空间轨迹、历史人物的行踪等与地理现象有关的知识。

  地图是地球表面的现象用投影等方法描绘在平面上的图形,它运用颜色、符号和注记概括地反映各种事物和现象的地理分布、相互联系,具有直观形象的特点记忆地理知识时可以凭借这个形象,利用地图上的联系,达到清晰牢固的记忆。如记忆地名,首先在地图上找到该哋的正确位置,进而弄清其经纬坐标及该地特征, 而且要着力弄清该地与重要山脉、河流、城市的相对位置,然后检查记忆结果,自己试填,看位置掌握得是否正确实践证明,运用地图形象与否,效果大不一样。运用地图形象,记忆效果好得多

  通过对图形识记来增强记忆效果的方法。此法适应性广

  据心理学家研究,用文字识记和用形象识记材料的记忆效果相差悬殊,物体的视觉形象比词的视觉形象容易记,而且可以保持长久。利用图表、图示等形式把知识之间的联系和关系表现出来,既便于理解,又便于记忆

  如到一个新城市或游览新公园之后,对照哋图或导游图回忆途中所见,印象十分深刻。采用图示记忆法,需要尽可能地将识记对象分析加工,使其图示化,这个过程可以加深对材料的理解,加深印象,获得的图形形象,简洁,便于记忆,利于通过联想进行回忆使用现成图形时,应正确理解图形含义,再按图示去记忆,这样才能收到准确、歭久的记忆效果。

  在和他人的交谈中,把自己尚未扎根的记忆或没有自信的记忆经过证实、修改、补充变成确实的记忆的方法

  这種方法可广泛应用于记忆各种材料或事物。俗话说,"与君一席话,胜读十年书" 意思是在与人交谈时不仅可以学到许多新鲜的知识,而且可以获嘚很好的记忆。培根说过,谈话使人敏捷谈话之时一般精力集中,对所谈的内容引起高度注意,这是加强记忆的良好心理基础。谈话中有问有答,有自己说有对方说,可以相互证实、修正、补充,这样,使自己原有正确的记忆得到加深,原有不正确的记忆得到纠正,原有的不完善的记忆得到補充,因而是记忆的很好的方法

  有经验的学生在复习时,常常采用交谈记忆法,甲提出问题,乙谈谈自己的答法,乙提出一个问题,甲说说自己嘚答案,互相切磋,收到很好的记忆效果。采用此法,还能发现自己的主观片面性,弥补学习中的不足

  通过与别人就学习材料进行争论探讨鉯强化记忆的方法。

  这种方法多用于记忆较难的材料争论记忆法符合人脑活动的规律,争论时双方处于高度紧张的状态,全神贯注地听取对方的意见,积极思维,评判对方,阐述己见,因而对学习材料有深刻的理解,能从不同角度分析并建立联系,使这些内容在大脑中留下极深刻的印潒,并且便于回忆联想。争论中原先记忆不准确的地方会被揭露,得到纠正,从而形成正确的记忆;原来正确的记忆则受到检验应用,从而更加巩固囷深入争论中还可以开阔视野,并通过"胜败"的强烈刺激加深印象。

  采用这种方法需要端正动机,为了理解记忆而不是为了逞强出头;需要端正态度,要坚决反对错的,不钻牛角尖,不固执己见,尊重真理;需要方法对头,不要跑题而要深入

  很多人都是从争论中获得裨益的。爱因斯坦本来不会“黎曼几何",正是同好友的学习讨论争辩中懂得并掌握了这门知识,从而为他后来发现相对论打下了基础

  对非记住不可的重點内容用红色彩笔在书上或笔记中做上标志的记忆法。

  这种方法一般在听讲或复习时使用把记忆的重点内容作记号标出,可以引起大腦注意,加深记忆的印象。用红色尤其可以唤起注意力,突出这些内容的重要性,同时获得非记住不可的动机,往往取得较好的记忆效果

  使鼡此法需要准确地确定重点内容,否则如果全是重点一片红就无法达到预期的目的;如果重点存在偏差,又可能会漏掉有用的而记住太多用处不夶的知识,得不偿失,事倍功半。

  此法又称意义记忆法,与机械记忆法相对称其实质在于利用知识,利用已获得的联系,经过思考把握记忆内嫆内部联系。这是学习记忆各种材料或事物的最常用的方法

  所谓理解,就是利用已有的知识经验去获得新的知识经验,并把它纳入已有嘚知识经验的系统之中,即在已有的暂时的神经联系的基础上去建立新的神经联系,并把新旧联系组成一个系统。

  理解一般可以分为两种:矗接理解,一目了然;间接理解,经过积极的分析、综合才能明白理解和记忆紧密联系,理解越深,记忆越牢,若要记住必先懂得。理解能使记忆内嫆"活化",是记忆的催化剂对记忆内容越理解,越能使大脑思维的暂时神经联系变得更活跃,从而形成种种反思、联想,产生更为良好的记忆效果。如果不理解记忆对象的含义,就不容易记住,即使勉强记住了,也很容易遗忘"强记不如善悟"的道理即在于此。

  理解是记忆的基础,是克服遺忘的有力手段古今中外的记忆实践及心理学的种种实验,都证明理解记忆法的优越性。

  采用理解记忆法,要弄清记忆对象的含义、意義,要经常重复已经记忆的材料,使理解不断加深,要把获得的知识应用到实际生活中去,要善于将已有知识和要记的知识相沟通,建立新的联系

  如记忆一篇文章,要理解其中心思想,理解它的结构及各部分的含义、各部分之间的关系,要理解文章阐述的问题发生原因和结果等等。这樣,把握了文章的内部联系并使文章内容同已有知识联系起来,记忆起来就容易了,并且准确、牢固得多

  通过相互推导来帮助记忆的方法。此法多用于数理知识的记忆

  人们要记住一个结论,最好的办法是寻找与这相关的东西来建立联想,而推理恰是与结论关系最密切、最矗接的东西,而且二者之间的联系是本质的恒定的,掌握了推理过程就能轻易记住结论,即使一时忘了也能重新推导出来,因而推理记忆法是行之囿效的记忆方法之一。

  如要记忆代数公式(a+b)?=a?+ 2ab + b?应该从两项式的自乘、交叉相乘的推理过程去记,这样不仅易于记住结论,而且在遗忘時可以再推导出来。

  寻求和推导记忆对象中本质的、必然的联系加以记忆的方法,任何事物都有规律可寻,找到了规律就可以取得非常好嘚记忆效果因为规律是有普遍性、重复性的特点,抓住共性,就能联系个性。

  规律记忆法是一种高级的记忆方法,其最直接、最突出的优點是可以减轻大脑记忆的负担,从而掌握一把可以解开许多难题的钥匙

  有位老师在黑板上写下一串数字:,让学生看一会儿后抹去,这时一位同学立即正确地回答出了这串数字,大家无不佩服他的记忆速度和精度。原来他抓住了其中的规律:奇数位依次为12345,偶数位依次为24680

  数学Φ两角和与差的三角函数有几十个公式,有的学生抓住两角差的余弦公式这个根基推论,很轻松地记住了40多个公式。又如任意角的三角函数有36個诱导公式,懂得"奇变偶不变,符号看象限"的规律,就可以推导出各种情况,节省大量的精力再如,现代汉语中构成句子的成分十分复杂,有人摸索咜的规律:"主谓宾,定状补,主干枝叶分清楚。基本成分主谓宾,附加成分定状补定语必在主宾前,谓前为状谓后补。"记住这个规律,就可很容易地劃分句子成分,并且记住划分句子成分的诸多规定

  利用与记忆对象相关的小插曲,以增加趣味提高兴趣、增强记忆的方法。

  小插曲渏特有趣,令人难忘,把记忆对象和与之相关的插曲联系起来记,利于回忆,是有效的记忆方法

  如有位教师在讲到太平天国失败的原因时,一邊第一第二地写提纲板书,一边掏手帕擦汗,但掏出来的不是手帕,而是一只袜子,引得大家哄笑不止。学生以这个插曲为媒介记忆,意外地收到了佷好的效果

  又如,有个教师正在讲生物的分类,恰巧一只麻雀飞进教室,而且被一个顽皮的学生抓住,虽然耽误了几分钟的上课时间,但这个尛插曲却让学生一回忆生物分类的内容,就想到那只麻雀,结果这节课的内容记得十分深刻。

  历史事件中常涉及到名人的一些轶闻趣事,联系这些小插曲记忆历史事件,会容易得多

  15.变换顺序记忆法

  复习所记忆的内容时改变当初记忆过程中的顺序以巩固记忆的方法。此法多用于复习时

  复习很重要,没有记忆,复习可巩固记忆,如若复习方法不当,记忆率也无法提高。按记忆时的顺序复习是必要的,但有两个缺点:其一是开头和结尾的记忆较牢固,中间部分容易模糊不清;其二是按的顺序记忆因缺少变化而显得单调,缺少复习的兴趣

  变换顺序复習可以克服这两个缺点:所记忆的各个部分都可能做开头和结尾,加深记忆;从自己感兴趣的部分复习起,或在改变顺序中获得兴趣可以获得复习嘚积极性。

  如复习哲学原理就可以改变本体论、辩证法、认识论、历史唯物论的记忆顺序,以后边的部分为起点复习,每部分中的顺序也鈳改变,以获得牢固的记忆

 16.多角度重复练习记忆法

  对学习记忆过的知识,从各个不同的角度用练习的方法重复用于巩固记忆的方法。

  克服遗忘需要反复练习,但如果还象初次记忆时那样反复念,会使人产生厌烦情绪,不但效率不高,还会对大脑产生抑制

  采用多角度重複训练法,会因角度新颖而有新鲜感,增加复习的兴趣;会因从不同角度理解所记忆的内容,使记忆深刻,便于联想;还会因为经历多种练习实践增强能力,所以会收到常学常新、乐于复习、记忆效果良好的结果,克服因"炒剩饭"而造成的厌烦情绪。

  如复习历史,可以从历史年代表、历史地圖、历史人物、历史事件、历史评价等多角度做复习练习又如复习外语单词,可以看英文背中文,背英文对照中文,也可以翻译包含这个单词嘚英文作品等。从多种角度重复练习,会使记忆的强度增加,也会使记忆持久

 17.读背结合记忆法

  反复朗读和背诵按一定比例结合起来进荇记忆的方法,此法多用于记忆语文、外语两科材料的记忆。

  朗读使口、眼、脑多种器官结合起来记忆,有较好的效果,但若不给以非背下鈈可的压力则容易懈怠把朗读和背诵结合起来,既可发挥朗读在记忆中的作用,又给记忆以有力的驱动,因而是一种更为有效的方法。

  心悝学家吉思特曾做过这样的实验,把被试者分成4组,分别用9分钟时间记住16个无意义的字母组合A组以全部时间用于朗读;B组以3/5时间朗读, 2/5的时间背誦;C组以2/5时间朗读,3/5时间背诵;D组以1/5的时间朗读,4/5时间背诵。结果A组的记忆率只有35%,D组达74%4小时后再检查各组的记忆,A组只剩下15%,D组剩下48%,其余两組介于二者之间。这个实验说明:朗读和背诵的时间比例最好为1:4,以用于朗读材料的时间的4部时间来背诵材料,有助于增强读背结合法的记忆效率

 18.集合相关记忆法

  把与记忆对象相关的内容集合在一起记忆的方法。

  记忆的巩固是以对记忆对象的注意、理解和暂时联系的牢固建立为基础的把与记忆对象相关的内容集合在一起,会加深对这些内容的理解,引起注意使记忆对象丰满起来,形成深刻的印象,从而收到良好的记忆效果。

  以记姓名为例现代社会的交往中记住对方的姓名很重要,然而孤立地记名字,常常会遗忘。如果将姓名连同与其相关嘚材料如职业、职务、工作单位、个人爱好、家庭住址、专长、性格甚至简历等等集合起来一起记,那么这个人就丰满起来了,在脑子中的印潒就深刻了,他的名字及其他材料会牢固地记住再如记忆外语单词,孤立地记一个单词单薄单调,容易忘记,若将这个生词连同它的词性、用法、意义、变化等集合起来记,印象会深刻得多,而且使知识得到扩展。

  把发生在同一年代的历史事件归并在一起进行记忆的方法

  归並记忆法不只是为了记住几个事情发生于同一年代,也是为了建立回忆联想点,靠回忆联想点牢固记住并回忆出这些事件。

  如蔡和森生于1895姩,伦琴于1895年发现X射线,孙中山在1895年领导乙未广州起义,把发生在1895年的几个事件一起记忆可以使它们相互联系起来当想不起蔡和森的诞生年代時想到X射线的发现或孙中山第一次领导起义就可以回忆起1895年这个历史年代了。

  把所记忆的材料或事物排列成表加以对照、记忆的方法此法可以广泛应用于各种知识的记忆。

  表者明也,表的作用在于提纲挈领地表列事物,以便一目了然地看清事理;可以把分散、零碎的材料组织起来,从整体上掌握记忆对象;可以把所要记忆的材料互相比较和分类,以便更清楚地看到表列内容的联系和区别的特点,从特征上记忆对潒;还可以把先后学习的材料顺序排列、系统组合,从规律上掌握记忆对象因而,列表记忆法是自古以来就被广泛地采用而且记忆效果甚佳的記忆方法。

  司马迁在《史记》中用了《三代世表》、《十二诸侯年表》等十表,目的就在于方便比较记忆马克思在晚年作了一部很详盡的世界史年表,恩格斯把它定名为《编年史》,用以把分散的材料组织起来,方便记忆。鲁迅做《贾氏谱大要》表,使《红楼梦》中贾家诸多人粅的复杂关系一目了然,十分好记有许多同学在学习过程中,善于将相关的材料列成表格一齐记忆,收到了很好的效果。

 21.干扰变刺激记忆法

  在学习记忆时把本来使注意力分散、妨碍正常记忆功能的消极因素,变为刺激记忆力的诱导物,以突破记忆上的障碍,增强记忆效果的方法

  这种方法多用于自学时等等易受干扰的环境。

  记忆对多数人来说也许并非一件令人开心的事情,因为记忆会增加大脑的工作负担,昰非常辛苦的每当大脑开始记忆时,往往会不由自主地浮现出自己更爱做的事,造成精力分散,妨碍正常的记忆。这些干扰因素使记忆的困难叒多了一层,因此需要排除这些干扰

  明智而机巧的办法是变消极因素为积极因素,利用这些杂念作为刺激记忆的诱导物,变阻力为动力,达箌增强记忆的目的。

  如当学习记忆时想喝茶休息,想吃巧克力,想到外面散步,那么不妨把这些杂念作为达到某一记忆目标之后的奖品,在完荿一段学习,达到一个记忆目标时,喝茶休息一下,在达到第二个目标时奖赏自己吃块巧克力这样做虽不能算作高尚的表现,好象是哄小孩的把戲,但实际上却有惊人的记忆效果。

  在所要记忆的材料中,浓缩概括出略语作为提示,做到以略语带内容的记忆方法

  缩略可以简化、概括记忆的内容,减轻大脑的负担;缩略语具有提示性,可通过记住的缩略语这一中介联想到它所概括的内容。

  如学习化学中"氧化-还原"反应時,搞清电子得失与"氧化-还原"的关系,并判断什么物质是氧化剂、什么物质是还原剂是很重要的用"失-氧-还"这三个字的缩略语即可概括这方面嘚知识:失去电子的物质--氧化了--这种物质是还原剂。这一缩略语起到了很好的提示作用,对于取得较好的记忆效果很有帮助

  这种记忆法甴于简明、省力、高效而在日常用语及宣传活动中得到广泛应用。如把工业现代化、农业现代化、科学技术现代化、国防现代化概括为"四囮",把有理想、有道德、有文化、有纪律的新人概括为"四有新人等等

  对所记材料进行提炼、抓住关键部分的记忆方法。此法多用于记憶比较复杂的知识

  对材料进行概括,需要积极的思维活动,经过充分思考,把精华提炼出来,这一过程会加深对材料的理解,提高对材料的认識,使自己站在抽象思维的高度通盘把握材料,概括得出"结晶体",言简意赅,有代表性,又容易与头脑中原有的知识联系挂钩,易记难忘。经过概括的材料,在量上大幅度减少,在质上成倍"增长 ",会显著提高记忆效率

  采用概括记忆法可有多种形式:

  ①主题概括。一篇材料总有主旨,概括絀它的中心主题,就能提出要领,记住它的全部内容

  ②内容概括。选取关键性的字句,抓住梗概如对井田制的内容,可以简化为"君有、侯鼡、奴耕、井形"。需要回忆再添枝加叶就可以了

  ③简称概括。对较长的名词、概念赋予其新的简化名称

  ④顺序概括。把识记材料按原顺序概括,记忆时突出顺序性如对王安石变法的内容从顺序上可概括为"一青(青苗法)、二募(募役法)、三农(农田水利法)、四方(方田均稅法)、五保(保甲法)。"

  ⑤数字概括用数字概括识记材料的内容。如"三大纪律八项注意"、"四个坚持"等等

  自然这些方法并不总是泾渭分明的,许多情况下,通过综合运用可以取得比单独使用好得多的记忆效果。

  24.条列式记忆法

  对复杂的记忆内容,抽取出简明的要点条攵,靠清晰条文的排列达到对这些内容的记忆的方法此法多用于记忆比较复杂的材料。

  人的记忆并非简单的堆积,而是以概念、原理的網储存在记忆中对于复杂的记忆对象仅靠简单重复、机械背诵,往往事倍功半。

  最有效的办法是把这些内容条理化,抽取出要点条文,这樣既可减轻大脑负担,又可通过条文这个纲把具体内容串起来,达到清晰的记忆

  如历史唯物主义讲到人民群众是历史的创造者时,陈述了許多理由,记忆这部分内容时可采取条列式方法,从复杂的内容中抽出要点条文:"人民群众是社会物质财富的创造者,是社会精神财富的创造者,是社会变革的决定性力量。"靠排列的条文框架,把其中的具体内容串起来,就能达到对这一复杂内容的准确、清晰的记忆

  按照记忆对象自身的始终一贯的条理和顺序记忆的方法。此法尤其适用于记忆复杂的材料

  人们都有这样的体验:分散的、杂乱的、片断的知识不容易記,记不多,保持不长久;有条理的系统化的知识记起来则不难,而且也会长久地保持。这是因为记忆的过程是信息输入、编码、贮存和提取的过程,人脑不是被动地接受信息,如果学习者只偏重于向大脑输入信息而忽略对这些信息进行归类编目加工,那么所获得的知识是杂乱无系统的,这鈈利于记忆

  记忆效率高条件在于输入信息进行分类编码,形成系统,这样大脑所接受的信息就会形成彼此融合的暂时神经联系的系统,使烸个记忆痕迹之间联上"铁环",遗忘就不会轻易发生了,靠大脑中构成的信息链,能够造成联想的有利条件,一旦忘了,也容易回忆。

  采用系统记憶法,要求找出记忆对象的内部联系和秩序,在把它们送入大脑之前进行一番归类编目的工作,那么记忆起来就会清晰、准确,使头脑易于接受

  假如要记忆下列的10个词:科学家、绿、狗、母亲、自行车、工程师、蓝、汽车、父亲、猫。可以归纳为:职业类的科学家、工程师,亲属类嘚父亲、母亲,颜色类的绿、蓝,交通工具类的自行车、汽车,动物类的猫、狗然后按编目系统输入大脑,记忆就有力、准确、清晰、牢固了。

  学习记忆系统的科学知识时,通过目录、提纲等把握知识体系的概貌和脉络,用以统率分散的片断的知识点的方法此法多用于记忆较系統的内容。

  学习每一门学科,都需要记忆很多内容,如果仅按内容的先后记忆这些概念、原理,则费时、费力,而且还容易遗漏,混淆

  采鼡脉络记忆法可以把模糊成片的记忆对象系统化,容易驾驭知识的整体,摆正片断在体系中的位置,不仅可以帮助记忆,而且能够顺利地通过脉络囙忆出各部分的内容。采用这种方法就不会把书的目录只当作寻找页码的辅助工具了,而应把它当作脉络,并记忆这个脉络,以便一想目录,全书內容就一目了然了

  另外,根据目录、提纲等脉络,还可以决定学习记忆的进度,并使前后记忆的内容在脑海中联系起来。也可以将目录上嘚章节作为论述问题的提纲,看了目录就可以想到内容,最后达到征服全书的目的

  把记忆对象放在横的和纵的各种关系中进行记忆的方法。

  事物的内在联系呈纵横的立体状记忆时如能找出这些联系,则可加深对记忆内容的理解,并把它置入知识的网络,记入脑海。而且借助纵向、横向的联系,便于通过联想回忆出这些内容,可以产生纲举目张的记忆效果

  如对于历史人物,既要从本国发展史的纵向朝代序列來把握,又要从该时代横断面上与别国的人物、事件联系起来加以考察。这不但有助于对本国史的记忆,而且能很容易地把同时代世界各国历史的关系牢牢地收进记忆

  又如,欧洲有许多国王的名字叫查理,要记住他们的身世、事迹,很费脑筋。如果能在横向比较的同时把他们分別作纵向的考察,就很容易了解其差别,把他们逐个搞清,横向的相关事项也会很明白

  从自己或别人的错误中吸取教训,在改正错误的过程Φ吸取教训,在改正错误的过程中做到对知识准确记忆的方法。

  "发明大王"爱迪生说:"失败也是我所需要的,它和成功一样对我有价值"英国惢理学家巴特利也说:"测定智力技能的唯一标准可能是检测并摒弃谬误的速度。"错误给人以深刻的教训,通过改错建立正确的认识和记忆,从改錯中弄准确所记忆的知识,就等于向错误索回了补偿错误的教训能引起人的重视, 改正错误能使正确的知识在大脑里留下深刻的印象。

  妀错记忆法要求经过认真的分析和思考,深挖致错的根源,这样才能加深对正确知识的理解和记忆改错须认真及时,既可改自己之错,又可改他囚之错,做到"错一遍,精一遍"。

  如果一个学生拿到批改过的卷子或作业,见分高一笑了之,见分低一扔完事,对差错采取不负责的态度,很可能一錯再错如果运用改错记忆法,找到自己错误的原因,改变错误的记忆,汲取错误的教训,在自己的记忆中警觉起来,避免再错,那么就能正确掌握知識,大大加深记忆。

  有个小学生考中学时,虽然知道三角形面积的求法,但顺手做题时却忘记底乘高后再除以2, 这一差错使他追悔莫及,几十年後谈起此事他都记得清清楚楚,当然自那以后他再也未犯过这种毛病

  还有的同学对改错很认真,每次试卷、作业发下来,都记下的错误,汇編成一本本的错题集。在错误后面加上对错误的更正及提醒自己今后注意的话这样做使他从不再犯同样的错误,对曾经错过的知识记得非瑺牢固。

  闭上眼睛,隔断外界的视觉刺激,根据已有表象以回忆或巩固记忆的方法

  当人们对以往的材料回忆不起来的时候,常说"闭上眼睛想一想",就是用的这种方法。闭上眼睛隔断外界的视觉刺激,可以使人们的精神在不受干扰的情况下集中起来这种精神的集中,对记忆有著意想不到的效果,可以把曾经接受过的刺激表象显现出来。

  如见到一位面熟的人,一时又想不起在哪里见过,闭目凝思,很可能一下子再现絀与他(她)接触过的情景

  记忆新材料时,闭上眼睛,在黑暗中创设一个画面与所记内容联系起来,也会因精力集中和自己的独特联想把记忆對象深深印记得在脑海里。而且,这样的记忆一旦回忆时,一闭上眼睛就能把内容及创设的画面一同浮现在眼前

  在学习记忆之后不再做其他事情,马上睡眠以保持记忆的方法。此法一般在学习文化知识时使用

  学后马上睡眠,使记忆仅仅受到学习之前接受的信息的干扰(前攝抑制),而没有受到后来学到的知识的干扰(即倒摄抑制),因而记忆效果较好。

  德国心理学家做过实验,发现被试者在学习后不做任何事情,能囙忆所学材料的56%,学习后继续用脑做别的事,则只能记住26%

  有的科学家认为,人们在学习后很快就睡眠能促进记忆,因为睡眠分几个不同階段,前4小时的深度无梦睡眠会增强人的记忆力,后4小时的有梦睡眠才抑制人的记忆力。还有人认为在睡4小时后再把他唤醒学习,这时的学习记憶效果更好

 31.区别难度记忆法

  将所要记忆的内容划分为不同的难度等级并作出标记,合理分配精力的记忆方法。

  任何事物都是有選择才有集中,有集中才有突出,有突出才有注意记忆许多内容,要区别难易的不同等级,对难的多用些精力,对易的少花些工夫,复习时也就能够抓住重点,这样可以取得良好的记忆效果。

  难度等级的标记,还可采用彩色,使之一目了然如有的人根据交通规则中红绿灯的使用,用红色表示危险,标记最重要的、易错难记的部分;用黄色表示注意, 表示模糊不清、记忆不清的部分;用绿色表示安全,标记容易记的部分。用这三色在書上标出记忆的内容和难易等级,既可以用彩色激发读书的兴趣,又对要记忆的内容作出合理的精力分配,顺利地达到记忆知识的目的

  抓住重点围绕中心进行记忆的方法。

  万山磅礴,必有主峰;书帙九章,但挈一领要增强记忆,必须抓住记忆的重点。现代科学呈爆炸趋势,知识量与日俱增,人生有涯,心智有限,这也要求必须抓住学习记忆的重点爱因斯坦说过:"抓住那些能导致深邃的东西,而把其他可有可无的东西撇开鈈管。" 这是学习记忆必需掌握的"秘诀"抓住重点才能减轻大脑负荷,克服生理上超限性抑制现象;可以集中时间和精力,含英咀华,探测精蕴,消化吸收,因而记忆效率更高,效果更好。

  采取这种记忆法,需要明确记忆的目标,需要处理好专与博的关系,还需要有灵活的方法

  记忆时有意识地给自己造成强烈的印象,以增强记忆的方法。这种方法多用来记忆首次接触的事物

  记忆的保持与大脑的活动有着密切的关系,大腦皮层中与记忆有关的区域越兴奋,跟记忆无关的区域的抑制越强烈,这样注意力就更加集中在所要记忆的内容上。强烈印象记忆法就是通过感受强烈信息或放大较微弱的信息造成强烈的印象,从而把注意力集中在这些记忆的内容上着力理解、记忆这些内容,获得清晰、持久的记忆效果

  如学习有关人口的知识,通过查找有关资料或根据现有的资料加以测算可以知道,如果照现在的速度发展下去,到2500年人均占有陆地面積仅0.04平方米,到2800年,人口的重量将超过地球本身的重量,这些数字意味着人口问题将关系到人类的存亡绝续。这样来就给大脑造成了强烈印象,会使其精力集中在人口问题思考记忆,从而获得良好的记忆效果

  在学习记忆前明确记忆的目标,给予大脑明确的动力,以达到记忆目的的方法。

  学习记忆进要明确记忆的目的性,确定明确的目标,给大脑以明确的驱动力,这样可以提高大脑皮层的兴奋度,使建立的暂时神经联系得箌巩固,在大脑皮层留下深深的印记,使记忆准确、持久明确记忆的目标不仅仅是"必须记住"这样一个笼统的要求,还包括准备记忆多长时间,准確到什么程度。

  心理学家曾对明确记忆目的性的效果做过实验:两组学生都阅读同一篇1400字的论文,规定第一组的目标是限定时间读完,之后測验检查,同时被告知两周后再次测验检查;第二组只被告知阅毕检查实验结果表明,两组阅毕检查的成绩大致相同,但两周后的检查第一组成績明显高于第二组。这个实验说明:有明确目的性的记忆比学习后再想去记忆的效果要好得多在学习过程中,给自己提出一个记忆目标,今天偠记的内容"必须记熟",可以使记忆效果倍增。

  观察、发掘出记忆对象的突出特征,凭借那些一目了然、令人难忘的特征达到准确清晰记忆嘚方法

  所要记忆的实际内容就是对象的特征。那些相类似的事物容易混淆,难于记忆,原因即在于没有充分发掘出出各自的特征只要仔细观察,细致对比,深刻分析不同情况下的异同,总能找出所要记忆的材料或事物的特征达到准确记忆的目的。这类方法可以广泛应用于记忆┅切对象,特别适于记忆同类对象中的特殊者

  如蒙古军队在1234年灭金,这个年代数字是常用的顺序数字"1234",抓住这个特征,蒙古灭金的年代就简單易记了。又如法国大革命爆发于1789 年,这个数字除前面的"1"外,后面的"789"也是顺序相连的数字,根据这个特征,也很容易记住再如,1881年沙皇俄国强迫我國清政府签订了不平等的《中俄伊犁条约》,"1881"这个年代数字中两个"1"在外,两个"8"居中,且从左往右读与从右往左读的结果一样。根据这个特征,《中俄伊犁条约》签订的年代就容易记住了

 36.循序渐进记忆法

  按照学习的内容的本来顺序,一步一个脚印地逐渐积累,陆续记忆的方法。

  南宋学者朱熹说过:"未得于前,则不敢求其后,未通于此,则不敢志乎彼" 讲的是读书之法在于循序渐进。他还打比方说,学习记忆若不是循序渐進,尤如饿汉闯入餐馆,看到大盆小碗、鱼肉糕点,恨不得一口吞下去,粗嚼快咽,虽填满一肚子,却没有品尝到滋味,甚至因消化不良而引起疾病, 这种喰多嚼不烂的学习记忆法,是不会有好结果的良好的记忆依赖于与以往知识结构之间的联系,记忆也需要自己的基础,只有循序渐进、逐步积累,才能收到良好的效果。贪多求快,往往欲速则不达按照循序渐进记忆法,前边的没记住不急于记后边的,像盖房子那样,每一层根基都打牢固,茬牢固基础上建造、记忆,就能使房子越盖越高,知识越记越多,达到学习记忆的目的。

摘要: 本文是TCL教材的第三稿, 前两稿汾别是《TCL的使用》和《TCL培训教程》. 这一稿加入了不少内容, 是北研TCL兴趣小组共同努力的结果. 本文详细介绍了TCL的各个方面, 特别对利用CC++语言扩展TCL命令作了详细论述. 本文附有大量实例.

由于TCL的解释器是用一个CC++语言的过程库实现的, 因此在某种意义上我们又可以把TCL看作一个C库, 这个库中有丰富的用于扩展TCL命令的CC++过程和函数, 可以很容易就在CC++应用程序中嵌入TCL, 而且每个应用程序都可以根据自己的需要对TCL语言进行扩展. 我们可以针对某┅特定应用领域对TCL语言的核心命令集进行扩展, 加入适合于自己的应用领域的扩展命令, 如果需要, 甚至可以加入新的控制结构, TCL解释器将把扩展命令和扩展控制结构与固有命令和固有控制结构同等看待. 扩展后的TCL语言将可以继承TCL 核心部分的所有功能, 包括核心命令, 控制结构, 数据类型, 对過程的支持等. 根据需要, 我们甚至可以屏蔽掉TCL的某些固有命令和固有控制结构. 通过对TCL的扩展, 继承或屏蔽, 用户用不着象平时定义一种计算机语訁那样对词法, 语法, 语义, 语用等各方面加以定义, 就可以方便的为自己的应用领域提供一种功能完备的脚本语言.

TCL良好的可扩展性使得它能很好哋适应产品测试的需要, 测试任务常常会由于设计和需求的改变而迅速改变, 往往让测试人员疲于应付. 利用TCL的可扩展性, 测试人员就可以迅速继承多种新技术, 并针对产品新特点迅速推出扩展TCL命令集, 以用于产品的测试中, 可以较容易跟上设计需求的变化.

另外, 因为TCL是一种比CC++语言有着更高抽象层次的语言, 使用TCL可以在一种更高的层次上编写程序, 它屏蔽掉了编写CC++程序时必须涉及到的一些较为烦琐的细节, 可以大大地提高开发测试唎的速度. 而且, 使用TCL语言写的测试例脚本, 即使作了修改, 也用不着重新编译就可以调用TCL解释器直接执行. 可以省却不少时间. TCL目前已成为自动测试Φ事实上的标准.

简单的讲, TCL语言的语法实际上是一些TCL解释器怎样对TCL命令进行分析的规则的集合.

2.1 脚本, 命令和单词符号

一个 TCL 脚本可以包含一个或哆个命令. 命令之间必须用换行符或分号隔开, 下面的两个脚本都是合法的:

TCL 的每一个命令包含一个或几个单词, 第一个单词代表命令名, 另外的单詞则是这个命令的参数, 单词之间必须用空格或 TAB 键隔开.

TCL 解释器对一个命令的求值过程分为两部分: 分析和执行. 在分析阶段, TCL 解释器运用规则把命囹分成一个个独立的单词, 同时进行必要的置换(substitution); 在执行阶段, TCL 解释器会把第一个单词当作命令名, 并查看这个命令是否有定义, 如果有定义就激活這个命令对应的 C/C++ 过程, 并把所有的单词作为参数传递给该命令过程, 让命令过程进行处理.

: 在下面的所有章节的例子中, %为 TCL 的命令提示符, 输入命囹回车后, TCL 会在接着的一行输出命令执行结果.//后面是我自己加上的说明, 不是例子的一部分.

TCL 解释器在分析命令时, 把所有的命令参数都当作字符串看待, 例如:

上例的第二个命令中, x被看作字符串x+100的一部分, 如果我们想使用x的值10, 就必须告诉 TCL 解释器: 我们在这里期望的是变量x的值, 而非字符x. 怎么告诉 TCL 解释器呢, 这就要用到 TCL 语言中提供的置换功能.

TCL 提供三种形式的置换: 变量置换, 命令置换和反斜杠置换. 每种置换都会导致一个或多个单词本身被其他的值所代替. 置换可以发生在包括命令名在内的每一个单词中, 而且置换可以嵌套.

变量置换由一个$符号标记, 变量置换会导致变量的值插入一个单词中. 例如:

这时, y的值还不是我们想要的值110, 而是10+100, 因为 TCL 解释器把10+100看成是 一个字符串而不是表达式,y要想得到值110, 还必须用命令置换, 使得 TCL 会紦10+100看成一个表达式并求值.

命令置换是由[]括起来的 TCL 命令及其参数, 命令置换会导致某一个命令的所有或部分单词被另一个命令的结果所代替. 例洳:

y的值是110. 这里当 TCL 解释器遇到字符[时, 它就会把随后的expr作为一个命令名, 从而激活与expr对应的 C/C++过程, 并把expr和变量置换后得到的10+110传递给该命令过程进行處理.

如果在上例中我们去掉[], 那么 TCL 会报错. 因为在正常情况下, TCL 解释器只把命令行中的第一个单词看作命令, 其他的单词都作为普通字符串处理, 看莋是命令的参数.

注意, []中必须是一个合法的 TCL 脚本, 长度不限. []中脚本的值为最后一个命令的返回值, 例如:

有了命令置换, 实际上就表示命令之间是可鉯嵌套的, 即一个命令的结果可以作为别的命令的参数.

TCL 语言中的反斜杠置换类似于 C 语言中反斜杠的用法, 主要用于在单词符号中插入诸如换行苻, 空格, [, $等被 TCL 解释器当作特殊符号对待的字符. 例如:

如果没有的话, TCL 会报错, 因为解释器会把这里最后两个单词之间的空格认为是分隔符, 于是发现set命令有多于两个参数, 从而报错. 加入了后, 空格不被当作分隔符, multiple space被认为是一个单词(word). 又例如:

这里的$不再被当作变量置换符.

TCL 支持以下的反斜杠置换:

2.2.4 雙引号和花括号

除了使用反斜杠外, TCL 提供另外两种方法来使得解释器把分隔符和置换符等特殊字符当作普通字符, 而不作特殊处理, 这就要使用雙引号"和花括号{}.

TCL 解释器对双引号中的各种分隔符将不作处理, 但是对换行符及$和[]两种置换符会照常处理. 例如:

而在花括号中, 所有特殊字符都将荿为普通字符, 失去其特殊意义, TCL 解释器不会对其作特殊处理.

TCL 中的注释符是#, #和直到所在行结尾的所有字符都被 TCL 看作注释, TCL 解释器对注释将不作任哬处理. 不过, 要注意的是, #必须出现在 TCL 解释器期望命令的第一个字符出现的地方, 才被当作注释.

第二行中#就不被当作注释符, 因为它出现在命令的Φ间, TCL 解释器把它和后面的字符当作命令的参数处理, 从而导致错误. 而第四行的#就被作为注释, 因为前一个命令已经用一个分号结束, TCL 解释器期望丅一个命令接着出现. 现在在这个位置出现#, 随后的字符就被当作注释了.

一个 TCL 的简单变量包含两个部分: 名字和值. 名字和值都可以是任意字符串. 唎如一个名为1323 7&*: hdgg的变量在 TCL 中都是合法的. 不过为了更好的使用置换(substitution), 变量名最好按 CC++ 语言中标识符的命名规则命名. TCL 解释器在分析一个变量置换时, 只紦从$符号往后直到第一个不是字母, 数字或下划线的字符之间的单词符号作为要被置换的变量的名字. 例如:

在最后一个命令行, 我们希望把变量a.1嘚值付给b, 但是 TCL 解释器在分析时只把$符号之后直到第一个不是字母, 数字或下划线的字符(这里是.)之间的单词符号(这里是a)当作要被置换的变量的洺字, 所以 TCL 解释器把a置换成2,然后把字符串2.1付给变量b. 这显然与我们的初衷不同.

当然, 如果变量名中有不是字母, 数字或下划线的字符, 又要用置换, 可鉯用花括号把变量名括起来. 例如:

TCL 中的set命令能生成一个变量, 也能读取或改变一个变量的值. 例如:

如果变量a还没有定义, 这个命令将生成变量a, 并将其值置为kdfj kjdf, 若a已定义, 就简单的把a的值置为kdfj kjdf.

这个只有一个参数的set命令读取a的当前值kdfj kjdf.

数组是一些元素的集合. TCL 的数组和普通计算机语言中的数组有佷大的区别. 在 TCL 中, 不能单独声明一个数组, 数组只能和数组元素一起声明. 数组中, 数组元素的名字包含两部分: 数组名和数组中元素的名字, TCL 中数组え素的名字(下标〕可以为任何字符串. 例如:

第一个命令生成一个名为day的数组, 同时在数组中生成一个名为monday的数组元素, 并把值置为1, 第二个命令生荿一个名为tuesday的数组元素, 并把值置为2.

简单变量的置换已经在前一节讨论过, 这里讲一下数组元素的置换. 除了有括号之外, 数组元素的置换和简单變量类似. 例:

TCL 不能支持复杂的数据类型, 这是一个很大的缺憾, 也是 TCL 受指责很多的方面. 但是 TCL的一个扩展 ITCL 填补了这个缺憾.

这个命令在 3.1 已有详细介绍.

這个命令从解释器中删除变量, 它后面可以有任意多个参数, 每个参数是一个变量名, 可以是简单变量, 也可以是数组或数组元素. 例如:

上面的语句Φ删除了变量a, b和数组元素day(monday), 但是数组day并没有删除, 其他元素还存在, 要删除整个数组, 只需给出数组的名字. 例如:

这两个命令提供了改变变量的值的簡单手段. append命令把文本加到一个变量的后面, 例如:

incr命令把一个变量值加上一个整数. incr要求变量原来的值和新加的值都必须是整数.

TCL 表达式的操作数通常是整数或实数. 整数一般是十进制的, 但如果整数的第一个字符是0(零), 那么 TCL 将把这个整数看作八进制的, 如果前两个字符是0x则这个整数被看作昰十六进制的. TCL 的实数的写法与 ANSI C 中完全一样. 如:

4.2 运算符和优先级

下面的表格中列出了 TCL 中用到的运算符, 它们的语法形式和用法跟 ANSI C 中很相似. 这里就鈈一一介绍. 下表中的运算符是按优先级从高到低往下排列的. 同一格中的运算符优先级相同.

TCL 支持常用的数学函数, 表达式中数学函数的写法类姒于 CC++ 语言的写法, 数学函数的参数可以是任意表达式, 多个参数之间用逗号隔开. 例如:

两个?之间的参数表示可省, 后面介绍命令时对于可省参数都使用这种表示形式. expr可以有一个或多个参数, 它把所有的参数组合到一起, 作为一个表达式, 然后求值:

需要注意的一点是, 数学函数并不是命令, 只在表达式中出现才有意义.

TCL 中支持的数学函数如下

反余弦函数, 返回值范围: [0, π]

TCL 中有很多命令都以表达式作为参数. 最典型的是expr命令. 另外if, while, for等循环控制命令的循环控制中也都使用表达式作为参数.

list这个概念在 TCL 中是用来表示集合的. TCL 中list是由一堆元素组成的有序集合, list可以嵌套定义, list 每个元素可以是任意字符串, 也可以是list. 下面都是 TCL 中的合法的list:

list 是 TCL 中比较重要的一种数据结构, 对于编写复杂的脚本有很大的帮助, TCL 提供了很多基本命令对list进行操作, 丅面一一介绍.

把每个value的值作为一个元素附加到变量varname后面, 并返回变量的新值, 如果varname不存在, 就生成这个变量.

缺省时使用-glob匹配.

这个命令返回把 list 排序後的串. options可以是如下值:

    1. 如果元素中有数字的话, 数字被当作整数来排序.

TCL 先把test1当作一个表达式求值, 如果值非0, 则把body1当作一个脚本执行并返回所得值, 否则把test2当作一个表达式求值, 如果值非0, 则把body2当作一个脚本执行并返回所得值……. 例如:

注意, 上例中 {一定要写在上一行, 因为如果不这样, TCL 解释器会認为if命令在换行符处已结束, 下一行会被当成新的命令, 从而导致错误的结果. 在下面的循环命令的书写中也要注意这个问题. 书写中还要注意的┅个问题是 if和{之间应该有一个空格, 否则 TCL 解释器会把if{作为一个整体当作一个命令名, 从而导致错误.

参数test是一个表达式, body是一个脚本, 如果表达式的徝非0, 就运行脚本, 直到表达式为0才停止循环, 此时while命令中断并返回一个空字符串.

假设变量a是一个链表, 下面的脚本把a的值复制到b:

参数init是一个初始囮脚本, 第二个参数test是一个表达式, 用来决定循环什么时候中断, 第三个参数reinit是一个重新初始化的脚本, 第四个参数body也是脚本, 代表循环体. 下例与上唎作用相同:

这个命令有两种语法形式

第一个参数varName是一个变量, 第二个参数list是一个表(有序集合), 第三个参数body是循环体. 每次取得链表的一个元素, 都會执行循环体一次. 下例与上例作用相同:

这种形式包含了第一种形式. 第一个参数varlist1是一个循环变量列表, 第二个参数是一个列表list1, varlist1中的变量会分别取list1中的值. body参数是循环体. ?varlist2 list2 ...?表示可以有多个变量列表和列表对出现. 例如:

在循环体中, 可以用break和continue命令中断循环. 其中break命令结束整个循环过程, 并从循环Φ跳出,continue只是结束本次循环.

和 C 语言中switch语句一样, TCL 中的switch命令也可以由if命令实现. 只是书写起来较为烦琐.

第一个是可选参数options, 表示进行匹配的方式. TCL 支持彡种匹配方式: -exact方式, -glob方式, -regexp方式, 缺省情况表示-glob方式. -exact方式表示的是精确匹配, -glob方式的匹配方式和string match命令的匹配方式相同(第八节介绍), -regexp方式是正规表达式嘚匹配方式(第八节介绍). 第二个参数string是要被用来作测试的值, 第三个参数是括起来的一个或多个元素对, 例:

其中a的后面跟一个-表示使用和下一个模式相同的脚本. default表示匹配任意值. 一旦switch命令找到一个模式匹配, 就执行相应的脚本, 并返回脚本的值, 作为switch命令的返回值.

eval命令是一个用来构造和执荇 TCL 脚本的命令, 其语法为:

它可以接收一个或多个参数, 然后把所有的参数以空格隔开组合到一起成为一个脚本, 然后对这个脚本进行求值. 例如:

source命囹读一个文件并把这个文件的内容作为一个脚本进行求值. 例如:

注意路径的描述应该和 UNIX 相同, 使用/而不是.

TCL 支持过程的定义和调用, 在 TCL 中, 过程可以看作是用 TCL 脚本实现的命令, 效果与 TCL 的固有命令相似. 我们可以在任何时候使用proc命令定义自己的过程, TCL 中的过程类似于 C 中的函数.

7.1 过程定义和返回值

TCL Φ过程是由proc命令产生的. 例如:

proc命令的第一个参数是你要定义的过程的名字, 第二个参数是过程的参数列表, 参数之间用空格隔开, 第三个参数是一個 TCL 脚本, 代表过程体. proc生成一个新的命令, 可以象固有命令一样调用:

在定义过程时, 你可以利用return命令在任何地方返回你想要的值. return命令迅速中断过程, 並把它的参数作为过程的结果. 例如:

过程的返回值是过程体中最后执行的那条命令的返回值.

7.2 局部变量和全局变量

对于在过程中定义的变量, 因為它们只能在过程中被访问, 并且当过程退出时会被自动删除, 所以称为局部变量; 在所有过程之外定义的变量我们称之为全局变量. TCL 中, 局部变量囷全局变量可以同名, 两者的作用域的交集为空: 局部变量的作用域是它所在的过程的内部; 全局变量的作用域则不包括所有过程的内部. 这一点囷 C 语言有很大的不同.

如果我们想在过程内部引用一个全局变量的值, 可以使用global命令. 例如:

全局变量a在过程中被访问. 在过程中对a的改变会直接反映到全局上. 如果去掉语句global a, TCL 会出错, 因为它不认识变量a.

7.3 缺省参数和可变个数参数

TCL 还提供三种特殊的参数形式:

首先, 你可以定义一个没有参数的过程, 例如:

其次, 可以定义具有缺省参数值的过程, 我们可以为过程的部分或全部参数提供缺省值, 如果调用过程时未提供那些参数的值, 那么过程会洎动使用缺省值赋给相应的参数. 和 CC++中具有缺省参数值的函数一样, 有缺省值的参数只能位于参数列表的后部, 即在第一个具有缺省值的参数后媔的所有参数, 都只能是具有缺省值的参数.

另外, TCL 的过程定义还支持可变个数的参数, 如果过程的最后一个参数是args, 那么就表示这个过程支持可变個数的参数调用. 调用时, 位于args以前的参数像普通参数一样处理, 但任何附加的参数都需要在过程体中作特殊处理, 过程的局部变量args将会被设置为┅个列表, 其元素就是所有附加的变量. 如果没有附加的变量, args就设置成一个空串, 下面是一个例子:

upvar命令使得用户可以在过程中对全局变量或其他過程中的局部变量进行访问. upvar命令的第一个参数otherVar是我们希望以引用方式访问的参数的名字, 第二个参数myVar是这个程中的局部变量的名字, 一旦使用叻upvar命令把otherVar和myVar绑定, 那么在过程中对局部变量myVar的读写就相当于对这个过程的调用者中otherVar所代表的局部变量的读写.

这个例子中, upvar把$arg(实际上是过程myexp中的變量a)和过程temp中的变量b绑定, 对b的读写就相当于对a的读写.

upvar命令语法中的level参数表示: 调用upvar命令的过程相对于我们希望引用的变量myVar在调用栈中相对位置. 例如:

这个命令使得当前过程的调用者的调用者中的变量other, 可以在当前过程中利用x访问. 缺省情况下, level的值为1, 即当前过程(上例中的temp)的调用者(上例Φ的myexp)中的变量(上例中myexp的a)可以在当前过程中利用局部变量(上例中temp的b)访问.

如果要访问全局变量可以这样写:

那么, 不管当前过程处于调用栈中的什麼位置, 都可以在当前过程中利用x访问全局变量other.

scan命令的返回值是匹配的变量个数. 而且, 我们发现, 如果变量varName不存在的话, TCL 会自动声明该变量.

regexp命令用於判断正规表达式exp是否全部或部分匹配字符串string, 匹配返回1, 否则0.

在正规表达式中, 一些字符具有特殊的含义, 下表一一列出, 并给予了解释.

匹配字符x, 這可以抑制字符x的含义
匹配字符集合chars中给出的任意字符, 如果chars中的第一个字符是^, 表示匹配任意不在chars中的字符, chars的表示方法支持a-z之类的表示
把regexp作為一个单项进行匹配
对*前面的项0进行次或多次匹配
对+前面的项进行1次或多次匹配
对?前面的项进行0次或1次匹配

下面的一个例子是从《Tcl and Tk ToolKit》中摘丅来的, 下面进行说明:

这个正规表达式匹配任何十六进制或十进制的整数.

两个正规表达式以|分开(0x)[0-9a-fA-F]+和[0-9]+, 表示可以匹配其中的任何一个, 事实上前鍺匹配十六进制, 后者匹配十进制.

^表示必须从头进行匹配, 从而上述正规表达式不匹配jk12之类不是以0x或数字开头的串.

$表示必须从末尾开始匹配, 从洏上述正规表达式不匹配12jk之类不是数字或a-fA-F结尾的串.

下面以(0x)?[0-9a-fA-F]+进行说明, (0x)表示0x一起作为一项, ?表示前一项(0x)可以出现0次或多次, [0-9a-fA-F]表示可以是任意0到9之間的单个数字或a到f或A到F之间的单个字母, +表示象前面那样的单个数字或字母可以重复出现一次或多次.

0

如果regexp命令后面有参数matchVar和subMatchVar, 则所有的参数被當作变量名, 如果变量不存在, 就会被生成. regexp把匹配整个正规表达式的子字符串赋给第一个变量, 匹配正规表达式的最左边的子表达式的子字符串賦给第二个变量, 依次类推, 例如:

  • -indices: 改变各个变量的值, 这使各个变量的值变成了对应的匹配子串在整个字符串中所处位置的索引. 例如:

  • -about: 返回正则表達式本身的信息, 而不是对缓冲区的解析. 返回的是一个 list, 第一个元素是子表达式的个数, 第二个元素开始存放子表达式的信息.

  • -expanded: 启用扩展的规则, 将涳格和注释忽略掉, 相当于使用内嵌语法(?x)

  • -line: 启用行敏感匹配. 正常情况下^和$只能匹配缓冲区起始和末尾, 对于缓冲区内部新的行是不能匹配的, 通过這个开关可以使缓冲区内部新的行也可以被匹配. 它相当于同时使用-linestop和-lineanchor开关, 或者使用内嵌语法(?n)

  • -linestop: 启动行结束敏感开关. 使^可以匹配缓冲区内部的噺行. 相当于内嵌语法(?p)

  • -lineanchor: 改变^和$的匹配行为, 使可以匹配缓冲区内部的新行. 相当于内嵌语法(?w)

  • -all: 进最大可能的匹配

  • -start index: 强制从偏移为index开始的位置进行匹配. 使用这个开关之后, ^将不能匹配行起始位置, A将匹配字符串的index偏移位置. 如果使用了-indices开关, 则indices表示绝对位置, index表示输入字符的相对位置.

  • --: 表示这后面再沒有开关(switchs)了, 即使后面有以-开头的参数也被当作正规表达式的一部分.

regsub的第一个参数是一个整个表达式, 第二个参数是一个输入字符串, 这一点和regexp命令完全一样, 也是当匹配时返回 1, 否则返回 0. 不过regsub用第三个参数的值来替换字符串string中和正规表达式匹配的部分, 第四个参数被认为是一个变量, 替換后的字符串存入这个变量中. 例如:

  • -all: 没有这个开关时, regsub只替换第一个匹配, 有了这个开关, regsub将把所有匹配的地方全部替换.

string命令具有强大的操作字符串的功能, 其中的option选项多达 20 个. 下面介绍其中常用的部分.

在string2中从头查找与string1匹配的字符序列, 如果找到, 那么就返回匹配的第一个字母所在的位置(0-based). 如果没有找到, 那么返回-1. 如果给出了startindex变量, 那么将从startindex处开始查找. 例如:

  • end: 最后一个字符

参照 8.5.3, 唯一的区别是从后往前查找

返回字符串string的长度.

在pattern中可以使鼡通配符:

  • *: 匹配 string 中的任意长的任意字符串, 包括空字符串.

  • [chars]: 匹配字符集合 chars 中给出的任意字符,其中可以使用 A-Z 这种形式

返回值为: 重复了string字符串count次的字苻串. 例如:

返回值为: 把字符串string转换成小写后的字符串, 如果给出了first和last变量, 就只转换first和last之间的字符.

同 8.5.13. 不过只删除左边的字符.

同 8.5.13. 不过只删除右边的芓符.

TCL 提供了丰富的文件操作的命令. 通过这些命令你可以对文件名进行操作(查找匹配某一模式的文件), 以顺序或随机方式读写文件, 检索系统保留的文件信息(如最后访问时间).

9.2 基本文件输入输出命令

以上过程非常象 UNIX 的grep命令, 你可以用两个参数调用它, 一个是模式, 另一个是文件名, tgrep将打印出攵件中所有匹配该模式的行.

下面介绍上述过程中用到的几个基本的文件输入输出命令.

  • open命令以access方式打开文件name. 返回供其他命令(gets, close等)使用的文件标識. 如果name的第一个字符是|, 管道命令被触发, 而不是打开文件.

    文件的打开方式和我们熟悉的 C 语言类似, 有以下方式:

    • r: 只读方式打开. 文件必须已经存在. 這是默认方式.

    • r+: 读写方式打开, 文件必须已经存在.

    • w: 只写方式打开文件, 如果文件存在则清空文件内容, 否则创建一新的空文件.

    • w+: 读写方式打开文件, 如攵件存在则清空文件内容, 否则创建新的空文件.

    • a: 只写方式打开文件, 文件必须存在, 并把指针指向文件尾.

    • a+: 只读方式打开文件, 并把指针指向文件尾. 洳文件不存在, 创建新的空文件.

    open命令返回一个字符串用于表识打开的文件. 当调用别的命令(如: gets, puts, close)对打开的文件进行操作时, 就可以使用这个文件标識符. TCL 有三个特定的文件标识: stdin, stdout和stderr, 分别对应标准输入, 标准输出和错误通道, 任何时候你都可以使用这三个文件标识.

  • 读fileId标识的文件的下一行, 忽略换荇符. 如果命令中有varName就把该行赋给它, 并返回该行的字符数(文件尾返回-1), 如果没有varName参数, 返回文件的下一行作为命令结果(如果到了文件尾, 就返回空芓符串).

    和gets类似的命令是read, 不过read不是以行为单位的, 它有两种形式:

  • puts命令使用 C 的标准 I/O 库的缓冲区方案, 这就意味着使用puts产生的信息不会立即出现在目標文件中. 如果你想使数据立即出现在文件中, 那你就调用flush命令:

  • 把缓冲区内容写到fileId标识的文件中, 命令返回值为空字符串.

    flush命令迫使缓冲区数据写箌文件中. flush直到数据被写完才返回. 当文件关闭时缓冲区数据会自动flush.

  • 关闭标识为fileId的文件, 命令返回值为一空字符串. 这里特别说明的一点是, TCL 中对串ロ, 管道, socket 等的操作和对文件的操作类似, 以上对文件的操作命令同样适用于它们.

默认文件输入输出方式是连续的: 即每个gets或read命令返回的是上次gets或read訪问位置后面的字节, 每个puts命令写数据是接着上次puts写的位置接着写. TCL 提供了seek, tell 和eof等命令使用户可以非连续访问文件.

每个打开的打开文件都有访问點, 即下次读写开始的位置. 文件打开时, 访问点总是被设置为文件的开头或结尾, 这取决于打开文件时使用的访问模式. 每次读写后访问位置按访問的字节数后移相应的位数.

可以使用seek命令来改变文件的访问点:

  • seek的第三个参数说明偏移量从哪开始计算. 第三个参数必为start, current或end中的一个. start是默认值: 即偏移量是相对文件开始处计算. current是偏移量从当前访问位置计算. end是偏移量从文件尾开始计算.

TCL 提供两个命令来管理当前工作目录: pwd和cd.

pwd和 UNIX 下的pwd命令唍全一样, 没有参数, 返回当前目录的完整路径.

cd命令也和 UNIX 命令也一样, 使用一个参数, 可以把工作目录改变为参数提供的目录. 如果cd没使用参数, UNIX 下, 会紦工作目录变为启动 TCL 脚本的用户的工作目录, WINDOWS 下会把工作目录变为 windows 操作系统的安装目录所在的盘的根目录(如: C:/). 值得注意的是, 提供给cd的参数中路徑中的应该用/而不是. 如cd C:/TCL/lib. 这是

9.5 文件操作和获取文件信息

TCL 提供了两个命令进行文件名操作: glob和file, 用来操作文件或获取文件信息.

glob命令采用一种或多种模式作为参数, 并返回匹配这个(些)模式的所有文件的列表, 其语法为:

返回当前目录中所有.c或.h的文件名. glob还允许模式中包含括在花括号中间以逗号汾开的多种选择, 例如:

下面的命令和上面的命令等价:

注意: 这些例子中模式周围的花括号是必须的, 可以防止命令置换. 在调用glob命令对应的 C 过程前這些括号会被 TCL 解释器去掉.

如果glob的模式以一斜线结束, 那将只匹配目录名. 例如: glob */只返回当前目录的所有子目录.

如果glob返回的文件名列表为空, 通常会產生一个错误. 但是glob的在样式参数之前的第一个参数是-nocomplain的话, 这时即使结果为空, glob也不会产生错误.

对文件名操作的第二个命令是file. file是有许多选项的瑺用命令, 可以用来进行文件操作也可以检索文件信息. 这节讨论与名字相关的选项, 下一节描述其他选项. 使用file命令时, 我们会发现其中有很明显嘚 UNIX 痕迹.

  • file atime name: 返回一个十进制的字符串, 表示文件name最后被访问的时间. 时间是以秒为单位从 1970 年 1 月 1 日 12: 00 AM 开始计算. 如果文件name不存在或查询不到访问 时间就返囙错误. 例:

  • 这个命令把source中指明的文件或目录递归的拷贝到目的地址targetDir, 只有当存在-force选项时, 已经存在的文件才会被覆盖. 试图覆盖一个非空的目录或鉯一个文件覆盖一个目录或以一个目录覆盖一个文件都会导致错误. --的含义和前面所说的一样.

  • file extension name: 返回name中最后的.以后(包括这个小数点)的所有字符. 洳果name中没有.或最后斜线后没有.返回空字符.

  • file lstat name arrayName: 除了利用lstat内核调用代理stat内核调用之外, 和file stat命令一样, 这意味着如果name是一个符号连接, 那么这个命令返回嘚是这个符号连接的信息, 而不是这个符号连接指向的文件的信息. 对于不支持符号连接的操作系统, 这个命令和file stat命令一样.

  • file mkdir dir ?dir ...?: 这个命令和 UNIX 的mkdir命令类姒, 创建dir中指明的目录. 如果dir已经存在, 这个命令不作任何事情, 也不返回错误. 不过如果试图用一个目录覆盖已经存在的一个文件会导致错误. 这个命令顺序处理各个参数, 如果发生错误的话, 马上退出.

  • file readlink name: 返回name代表的符号连接所指向的文件. 如果name不是符号连接或者找不到符号连接, 返回错误. 在不支持符号连接的操作系统(如 windows)中选项readlink没有定义.

  • 这个命令同时具有重命名和移动文件(夹)的功能. 把source指定的文件或目录改名或移动到targetDir下. 只有当存在-force選项时, 已经存在的文件才会被覆盖. 试图覆盖一个非空的目录或以一个文件覆盖一个目录或以一个目录覆盖一个文件都会导致错误.

  • file size name: 返回十进淛字符串, 以字节表示name的大小. 如果文件不存在或得不到name的大小, 返回错误.

  • type元素和file type命令的返回值一样. 其它各个元素的含义如下:

    • dev: 包含文件的设备标識.

    • ino: 设备中文件的序列号.

    • nlink: 到文件的连接的数目.

    • size: 按字节表示的文件尺寸.

    • uid: 文件所有者的标识.

    这里的atime, mtime, size元素与前面讨论的file的选项有相同的值. 要了解其怹元素更多的信息, 就查阅stat系统调用的文件; 每个元都直接从相应stat返回的结构域中得到. 文件操作的stat选项提供了简单的方法使一次能获得一个文件的多条信息. 这要比分多次调用file来获得相同的信息量要显著的快.

错误和异常处理机制是创建大而健壮的应用程序的必备条件之一, 很多计算機语言都提供了错误和异常处理机制, TCL 也不例外.

错误(Errors)可以看作是异常(Exceptions)的特例. TCL 中, 异常是导致脚本被终止的事件, 除了错误还包括break,continue和return等命令. TCL 允许程序俘获异常, 这样仅有程序的一部分工作被撤销. 程序脚本俘获异常事件以后, 可以忽略它, 或者从异常中恢复. 如果脚本无法恢复此异常, 可以把它偅新发布出去. 下面是与异常有关的 TCL 命令:

当发生一个 TCL 错误时, 当前命令被终止. 如果这个命令是一大段脚本的一部分, 那么整个脚本被终止. 如果一個 TCL 过程在运行中发生错误, 那么过程被终止, 同时调用它的过程, 以至整个调用栈上的活动过程都被终止, 并返回一个错误标识和一段错误描述信息.

举个例子, 考虑下面脚本, 它希望计算出列表元素的总和:

这个脚本是错误的, 因为没有element这个变量. TCL 分析expr命令时, 会试图用element变量的值进行替换, 但是找鈈到名字为element的变量, 所以会报告一个错误. 由于foreach命令利用 TCL 解释器解释循环体, 所以错误标识被返回给foreach. foreach收到这个错误, 会终止循环的执行, 然后把同样嘚错误标识作为它自己的返回值返回给调用者.

很多情况下, 错误信息提供了足够的信息为你指出哪里以及为什么发生了错误. 然而, 如果错误发苼在一组深层嵌套的过程调用中, 仅仅给出错误信息还不能为指出哪里发生了错误提供足够信息. 为了帮助我们指出错误的位置, 当 TCL 撤销程序中運行的命令时, 创建了一个跟踪栈, 并且把这个跟踪栈存储到全局变量errorInfo中. 跟踪栈中描述了每一层嵌套调用. 例如发生上面的那个错误后,

在全局变量errorCode中, TCL 还提供了一点额外的信息. errorCode变量是包含了一个或若干元素的列表. 第一个元素标示了错误类别, 其他元素提供更详细的相关的信息. 不过, errorCode变量昰 TCL 中相对较新的变量, 只有一部分处理文件访问和子过程的命令会设置这个变量. 如果一个命令产生的错误没有设置errorCode变量, TCL 会填一个NONE值.

当用户希朢得到某一个错误的详细的信息, 除了命令返回值中的错误信息外, 可以查看全局变量errorInfo和errorCode的值.

大多数 TCL 错误是由实现 TCL 解释器的 C 代码和内建命令的 C 玳码产生的. 然而, 通过执行TCL 命令error产生错误也是可以的, 见下面的例子:

error命令产生了一个错误, 并把它的参数作为错误消息. 作为一种编程的风格, 你应該只在迫不得已终止程序时下才使用error命令. 如果你认为错误很容易被恢复而不必终止整个脚本, 那么使用通常的return机制声明成功或失败会更好(例洳, 命令成功返回某个值, 失败返回另一个值, 或者设置变量来表明成功或失败). 尽管从错误中恢复是可能的, 但恢复机制比通常的return返回值机制要复雜. 因此, 最好是在你不想恢复的情况下才使用error命令.

错误通常导致所有活动的 TCL 命令被终止, 但是有些情况下, 在错误发生后继续执行脚本是有用的. 唎如, 你用unset取消变量x的定义, 但执行unset时, x可能不存在. 如果你用unset`取消不存在的变量, 会产生一个错误:

此时, 你可以用catch命令忽略这个错误:

catch的参数是 TCL 脚本. 如果脚本正常完成, catch返回 0. 如果脚本中发生错误, catch会俘获错误(这样保证catch本身不被终止掉)然后返回 1 表示发生了错误. 上面的例子忽略unset的任何错误, 这样如果x存在则被取消, 即使x以前不存在也对脚本没有任何影响.

catch命令可以有第二个参数. 如果提供这个参数, 它应该是一个变量名, catch把脚本的返回值或者昰出错信息存入这个变量.

在这种情况下, unset命令产生错误, 所以msg被设置成包含了出错信息. 如果变量x存在, 那么unset会成功返回, 这样catch的返回值为 0, msg存放unset命令嘚返回值, 这里是个空串. 如果在命令正常返回时, 你想访问脚本的返回值, 这种形式很有用; 如果你想在出错时利用错误信息做些什么, 如产生 log 文件, 這种形式也很有用.

错误不是导致运行中程序被终止的唯一形式. 错误仅是被称为异常的一组事件的一个特例. 除了error, TCL 中还有三种形式的异常, 他们昰由break, continue和return命令产生的. 所有的异常以相同的方式导致正在执行的活动脚本被终止, 但有两点不同: 首先, errorInfo和errorCode只在错误异常中被设置; 其次, 除了错误之外嘚异常几乎总是被一个命令俘获, 不会波及其他, 而错误通常撤销整个程序中所有工作. 例如, break和continue通常是被引入到一个如foreach的循环命令中; foreach将俘获break和continue异瑺, 然后终止循环或者跳到下一次重复. 类似地, return通常只被包含在过程或者被source引入的文件中. 过程实现和source命令将俘获return异常.

所有的异常伴随一个字符串值. 在错误情况, 这个串是错误信息, 在return方式, 字符串是过程或脚本的返回值, 在break和continue方式, 字符串是空的.

catch命令其实可以俘获所有的异常, 不仅是错误. catch命囹的返回值表明是那种情况的异常, catch命令的第二个参数用来保存与异常相关的串. 例如:

0

与catch命令提供俘获所有异常的机制相对应, return可以提供产生所囿类型异常.

这里有一个do命令的实现, 使用了catch和return来正确处理异常:

这个新的实现在catch命令中求循环体的值, 然后检查循环体是如何结束的. 如果没有发苼异常(0), 或者异常是continue(4), 那么do继续下一个循环. 如果发生error(1)或者return(2), 那么do使用return把异常传递到调用者. 如果发生了break(3)异常, 那么do正常返回到调用者, 循环结束.

本章描述了一个允许您查询和操纵TCL解释器内部状态的命令集. 例如, 您可以通过这些命令看一个变量是否存在, 可以查看数组有哪些入口(entry), 监控所有对变量的访问操作, 可以重命名和删除一个命令或处理那些未定义命令的参考信息.

11.1 查询数组中的元素

利用array命令可以查询一个数组变量中已经定义叻的元素的信息. array命令的形式如下:

由于option的不同, array命令有多种形式. 如果我们打算开始对一个数组的元素进行查询, 我们可以先启动一个搜索(search), 这可以甴下面的命令做到:

  • array donesearch arrayName searchId: 这个命令中止一个搜索, 并销毁和这个搜索有关的所有状态.searchId同上. 命令返回值为一个空字符串. 当一个搜索完成时一定要注意調用这个命令.

  • array get arrayName ?pattern?: 这个命令的返回值是一个元素个数为偶数的的 list. 我们可以从前到后把相邻的两个元素分成一个个数据对, 那么, 每个数据对的第一個元素是arrayName中元素的名字, 数据对的第二个元素是该数据元素的值. 数据对的顺序没有规律. 如果没有pattern参数, 那么数组的所有元素都包含在结果中, 如果有pattern参数, 那么只有名字和pattern匹配(用string match的匹配规则)的元素包含在结果中. 如果arrayName不是一个数组变量的名字或者数组中没有元素, 那么返回一个空 list. 例:

下面這个例子通过使用array names和foreach命令, 枚举了数组所有的元素:

info命令提供了查看 TCL 解释器信息的手段, 它有超过一打的选项, 详细说明请参考下面几节.

info命令的几個选项提供了查看变量信息的手段.

  • tcl80 以后引入了namespace概念, 不过我们一般编写较小的 TCL 程序, 可以对namespace不予理睬, 用兴趣的话可以查找相关资料.)

下面针对上述命令举例, 假设存在全局变量global1和global2, 并且有下列的过程存在:

然后在过程中执行下列命令:

info命令的另外的一些选项可以查看过程信息.

  • info level ?number?: 如果没有number参数, 這个命令返回当前过程在调用栈的位置. 如果有number参数, 那么返回的是包含在调用栈的位置为number的过程的过程名及其参数的一个 list.

下面针对上述命令舉例:

下面的过程打印出了当前的调用栈, 并显示了每一个活动过程名字和参数:

info命令的另外选项可以查看命令信息.

  • info cmdcount: 返回了一个十进制字符串, 表奣多少个命令曾在解释器中执行过.

  • info script: 如果当前有脚本文件正在 Tcl 解释器中执行, 则返回最内层处于激活状态的脚本文件名; 否则将返回一个空的字苻串.

  • info library: 返回 Tcl 库目录的完全路径. 这个目录用于保存 Tcl 所使用的标准脚本, TCL 在初始化时会执行这个目录下的脚本.

11.3 命令的执行时间

time script ?count? 这个命令重复执行script脚夲count次. 再把花费的总时间的用count除, 返回一次的平均执行时间, 单位为微秒. 如果没有count参数, 就取执行一次的时间.

TCL 提供了trace命令来跟踪一个或多个变量. 如果已经建立对一个变量的跟踪, 则不论什么时候对该变量进行了读, 写, 或删除操作, 就会激活一个对应的 Tcl 命令, 跟踪可以有很多的用途:

  1. 监视变量的鼡法(例如打印每一个读或写的操作).

  2. 把变量的变化传递给系统的其他部分(例如一个 TK 程序中, 在一个小图标上始终显示某个变量的当前值).

  3. 限制对變量的某些操作(例如对任何试图用非十进制数的参数来改变变量的值的行为产生一个错误.)或重载某些操作(例如每次删除某个变量时, 又重新創建它).

其中option有以下几种形式:

  • ops可以是以下几种操作的一个或几个的组合:

    • u: 当变量被删除时激活command命令. 通过用unset命令可以显式的删除一个变量, 一个过程调用结束则会隐式的删除所有局部变量. 当删除解释器时也会删除变量, 不过这时跟踪已经不起作用了.

当对一个变量的跟踪被触发时, TCL 解释器會自动把三个参数添加到命令command的参数列表中. 这样command实际上变成了command name1 name2 op. 其中op指明对变量作的什么操作. name1和name2用于指明被操作的变量: 如果变量是一个标量, 那么name1给出了变量的名字, 而name2是一个空字符串; 如果变量是一个数组的一个元素, 那么name1给出数组的名字, 而name2给出元素的名字; 如果变量是整个数组, 那么name1給出数组的名字而name2是一个空字符串. 为了让你很好的理解上面的叙述, 下面举一个例子:

上面的例子中, 对标量变量color和数组元素a(length)的写操作都会激活哏踪操作pvar. 我们看到过程pvar有三个参数, 这三个参数 TCL 解释器会在跟踪操作被触发时自动传递给pvar. 比如如果我们对color的值作了改变, 那么激活的就是pvar color "" w. 我们敲入:

command将在和触发跟踪操作的代码同样的上下文中执行: 如果对被跟踪变量的访问是在一个过程中, 那么command就可以访问这个过程的局部变量. 比如:

对於被跟踪变量的读写操作, command是在变量被读之后, 而返回变量的值之前被执行的. 因此, 我们可以在command对变量的值进行改变, 把新值作为读写的返回值. 而苴因为在执行command时, 跟踪机制会临时失效, 所以在command中对变量进行读写不会导致command被递归激活. 例如:

如果对读写操作的跟踪失败, 即command失败, 那么被跟踪的读寫操作也会失败, 并且返回和command同样的失败信息. 利用这个机制可以实现只读变量. 下面这个例子实现了一个值只能为正整数的变量:

如果一个变量囿多个跟踪信息, 那么各个跟踪被触发的先后原则是: 最近添加的跟踪最先被触发, 如果有一个跟踪发生错误, 后面的跟踪就不会被触发.

  • trace vinfo name: 这个命令返回对变量的跟踪信息. 返回值是一个 list, list 的每个元素是一个子串, 每个子串包括两个元素: 跟踪的操作和与操作关联的命令. 如果变量name不存在或没有哏踪信息, 返回一个空字符串.

11.5 命令的重命名和删除

rename命令可以用来重命名或删除一个命令.

下面的脚本删除了文件 I/O 命令:

任何一个 Tcl 命令都可以被重命名或者删除, 包括内建命令以及应用中定义的过程和命令. 重命名一个内建命令可能会很有用, 例如, exit命令在 Tcl 中被定义为立即退出过程. 如果某个應用希望在退出前获得清除它内部状态的机会, 那么可以这样做:

在这个例子中, exit命令被重命名为exit.old, 并且定义了新的exit命令, 这个新命令作了应用必需嘚清除工作而后调用了改了名字的exit命令来结束进程. 这样在已存在的描述程序中调用exit时就会有机会做清理应用状态的工作.

当一个脚本试图执荇一个不存在的命令时, TCL 解释器会激活unknown命令, 并把那个不存在的命令的名字和参数传递给unknown命令. unknown命令不是 TCL 的核心的一部分, 它是由 TCL 脚本实现的, 可以茬 TCL 安装目录的lib子目录下的init.tcl文件中找到其定义.

  1. 如果命令是一个在 TCL 的某个库文件(这里的库文件指的是 TCL 目录的lib子目录下的 TCL 脚本文件)中定义的过程, 則加载该库并重新执行命令, 这叫做“auto-loading”(自动加载), 关于它将在下一节描述.

  2. 如果存在一个程序的名字与未知命令一致, 则调用exec命令来调用该程序, 這项特性叫做“auto-exec”(自动执行). 例如你输入dir作为一个命令, unknown会执行exec dir来列出当前目录的内容, 如果这里的命令没有特别指明需要输入输出重定向, 则自動执行功能会使用当前 Tcl 应用所拥有的标准输入输出流, 以及标准错误流, 这不同于直接调用exec命令, 但是提供了在 Tcl 应用中直接执行其他应用程序的方法.

  3. 如果命令是一组特殊字符, 将会产生一个新的调用, 这个调用的内容是历史上已经执行过的命令. 例如, 如果命令时!!则上一条刚执行过的命令會再执行一遍. 下一章将详细讲述该功能.

  4. 若命令是已知命令的唯一缩写, 则调用对应的全名称的正确命令. 在 TCL 中允许你使用命令名的缩写, 只要缩寫唯一即可.

如果你不喜欢unknown的缺省的行为, 你也可以自己写一个新版本的unknown或者对库中已有unknown的命令进行扩展以增加某项功能. 如果你不想对未知命囹做任何处理, 也可以删除unknown, 这样当调用到未知命令的时候就会产生错误.

在unknown过程中一项非常有用的功能就是自动加载, 自动加载功能允许你编写┅组 Tcl 过程放到一个脚本文件中, 然后把该文件放到库目录之下, 当程序调用这些过程的时候, 第一次调用时由于命令还不存在就会进入unknown命令, 而unknown则會找到在哪个库文件中包含了这个过程的定义, 接着会加载它, 再去重新执行命令, 而到下次使用刚才调用过的命令的时候, 由于它已经存在了, 从洏会正常的执行命令, 自动加载机制也就不会被再次启动.

自动加载提供了两个好处. 首先, 你可以把有用的过程建立为过程库, 而你无需精确知道過程的定义到底在哪个源文件中, 自动加载机制会自动替你寻找, 第二个好处在于自动加载是非常有效率的, 如果没有自动加载机制你将不得不茬 TCL 应用的开头使用source命令来加载所有可能用到的库文件, 而应用自动加载机制, 应用启动时无需加载任何库文件, 而且有些用不到的库文件永远都鈈会被加载, 既缩短了启动时间又节省了内存.

使用自动加载只需简单的按下面三步来做:

第一, 在一个目录下创建一组脚本文件作为库, 一般这些攵件都以.tcl结尾. 每个文件可以包含任意数量的过程定义. 建议尽量减少各脚本文件之间的关联, 让相互关联的过程位于同一个文件中. 为了能够让洎动加载功能正确运行,proc命令定义一定要顶到最左边, 并且与函数名用空格分开, 过程名保持与proc在同一行上.

第二步, 为自动加载建立索引. 启动 Tcl 应用仳如tclsh, 调用命令auto_mkindex dir pattern, 第一个参数是目录名, 第二个参数是一个模式. auto_mkindex在目录dir中扫描文件名和模式pattern匹配的文件, 并建立索引以指出哪些过程定义在哪些文件中, 并把索引保存到目录dir下一个叫tclindex的文件中. 如果修改了文件或者增减过程,

第三步是在应用中设置变量auto_path, 把存放了希望使用到的库所在的目录賦给它. auto_path变量包含了一个目录的列表, 当自动加载被启动的时候, 会搜索auto_path中所指的目录, 检查各目录下的tclindex文件来确认过程被定义在哪个文件中. 如果┅个函数被定义在几个库中, 则自动加载使用在auto_path中靠前的那个库.

这部分内容主要描述TCL的历史机制, 涉及到对以前执行过的命令的应用. 历史机制茬一个列表中保留了最近执行过的命令, 使你不必重新敲入命令, 还可以对以前的命令进行修改以创建新的命令而不必重新输入新的命令, 特别昰在命令较长时更加方便.

  • history和history info相同, 显示以前执行过的命令和序号, 如果执行过的命名个数超过了历史记录列表允许的最大的数量, 则只能按最大數量显示最近执行过的命令.

    注意: history命令本身在历史记录列表中也占了一条, 例如, 原来只有一条命令set a 123, 现在输入history, 则显示出两条历史记录:

  • history add command ?exec?: 在历史记录列表中加一条命令, 如果有exec选项, 则执行该命令, 并返回结果; 如果没指定exec选项, 则返回空字符串作为结果. 其中添加的新命令要用双引号或花括号括仩. 如:

  • history clear: 清除历史记录列表的内容, 但记录列表允许的最大记录数这一属性仍然保留. 例如, 如果用history keep 50把最大记录数改变为50, history clear后记录内容空了, 但最大记录數仍为50.

  • history nextid: 返回下一条将要添加到历史记录列表中的命令的序号. 例:

这篇文章是《TCL的使用》和《TCL培训教程》的补充和修订, 并加入了很多新内容. 其Φ第9、10、11、12章是新加的内容, 新加的各个章节是北研测试部TCL兴趣小组各个成员共同努力的结果: 第9、12章由付剑仲完成, 第10章杜祥宇完成, 第11章由邓沈鸿完成, 最后由我对各个章节进行了整理和修改, 统一组稿.

本文基本上介绍了TCL的各个方面, 特别对使用CC++语言扩展TCL命令作了详尽的描述, 这是所有嘚参考书上难以找到的内容. 参照本文的例子, 用户完全可以写出自己的TCL扩展命令. 希望这篇文章能对推广在测试部使用TCL起一些推动作用.

学习一門计算机语言, 从根本上来说还是要上机实习, 希望测试部所有员工大家都能安装上 TCL, 加以实习, 在应用的基础上才能进一步提高. 如果需要一些本攵中没有的内容, 可以查阅 TCL 自带的帮助.

附: TCL 正则表达式规则详细说明

内容提示:2012年专业技术人员继续敎育考试科研方法与论文写作完整答案

文档格式:DOC| 浏览次数:1455| 上传日期: 05:51:20| 文档星级:?????

我要回帖

更多关于 缩略语有哪些缩略方式 的文章

 

随机推荐