- 浏览: 219607 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
Wangwei86609:
非常好的规则引擎框架,支持决策树和多线程运行规则https:/ ...
规则引擎 -
hzxlb910:
真详细,收藏哈
maven setting.xml配置说明 -
东方胜:
[b][/b]
脚本语言 Tcl -
345161974:
hyw520110 写道345161974 写道这个Visua ...
Visual Tcl Binary 完整版(完美中文支持) -
hyw520110:
345161974 写道这个Visual Tcl Binary ...
Visual Tcl Binary 完整版(完美中文支持)
CL:字符串命令
有一个关于TCL的哲学探讨:TCL语法中的一切是否都是字符串?(以及这是不是一件好事),但是无论你的论点如何,你都无法否认字符串在TCL语法中扮演着非常重要的角色,iRules也是一样。TCL提供了许多的字符串命令,其中的一些会在本文中提及。
- string map
- string range
- string trim
- string trimleft
- string trimright
我们将会看到这几条命令的几个具体案例,主要是因为我仍然觉得其它人在TCL文档中使用的例子实在是太少了。
string map ?-nocase? mapping string
在字符串中,替换子串是其于映射中的Key-Value对。映射是指一个key value key value ... 的列表,字符串中每一个Key的实例都会被它所对应的Value所取代。如果指定了-nocase模式,那么匹配就会执行,而不考虑大小写的差异。Key和Value都可能是一个多重字符。替换是按特定的顺序进行的,所以在列表中第一个出现的Key就会被第一个选中,依此类推。下面的一个例子是由论坛网友Hoolio提供的,有两种映射模式,用Https取代Http,并把服务器端口号去掉。
when HTTP_RESPONSE {
# Check if a response is a redirect 查看响应是不是一个重定向。
if {[HTTP::is_redirect]}{
log local0. "Original Location: [HTTP::header value Location]"
# Assume the server will use it's own TCP port in redirects and remove it. Also replace http:// with https://.
#假设服务器会在重定向时使用它自己的TCP端口并把它去掉。同时用https:// 替换http://
HTTP::header replace Location [string map -nocase ]list http:// https:// ":[LB::server port]" ""[ ]HTTP::header value Location[]
log local0. "Updated location (string map): [string map -nocase ]list http:// https:// ":[LB::server port]" ""[ ]HTTP::header value Location[]"
}
}
字符串只进行一次迭代,所以先前替换的Key不会影响到之后的Key匹配。例如:
% string map {abc 1 ab 2 a 3 1 0} 1abcaababcabababc
01321221
什么?这是TCL文档里的一个不那么直观的例子。但事实上,我非常喜欢它。我们来详细的分析一下。这个例子里有四个key/value对
- abc, if found, will be replaced by a 1 abc,如果有的话,会被1替代
- ab, if found, will be replaced by a 2 ab,如果有的话,会被2替代
- a, if found, will be replaced by a 3 a,如果有的话,会被3替代
- 1, if found, will be replaced by a 0 1,如果有的话,会被0替代
String Map Multiple Key/Value Example |
||
Mapping |
Original String |
Resulting String |
1st (abc->1) |
1abcaababcabababc |
11aab1abab1 |
2nd (ab->2) |
11aab1abab1 |
11a21221 |
3rd (a->3) |
11a21221 |
11321221 |
4th (1->0) |
11321221 |
01321221 |
注意看第四组映射,返回的字符串是01321221,而不是00320220。为什么呢?这是因为字符串只进行一次迭代,所以先前替换的Key不会影响到之后的Key匹配。
string range string first last
返回字符串里某一范围内的连续字符,以索引里的第一个字符起始,以索引里的最后一个字符结束。索引值为零指的就是字符串里的第一个字符,起始和结束是由索引方式来指定的。如果起始值小于零,那就当它当做零来处理,如果结束值大于等于字符串长度,就把它当做结尾。如果起始值大于结束值,则会返回一个空的字符串。Colin成功的提出了一个通过字符串范围来删除Host里的已知端口的例子。请注意他非常漂亮的使用了0作为起始,以end-5作为结束。当然,这个问题可以通过getfield命令更简便,更轻松的解决,但那是另一回事。
when HTTP_REQUEST {
if { [HTTP::host] ends_with "8010" } {
set http_host [string range ]HTTP::host[ 0 end-5]
HTTP::redirect "https://$http_host[HTTP::uri]"
}
}
在这个例子里,网友unRuleY提供了一个去掉URI中最前面几个字符的解决方案:
when HTTP_REQUEST {
set uri [HTTP::uri]
if { $uri starts_with "/axess2" } {
HTTP::uri [string range $uri 7 end]
pool pool1
}
}
string trim string ?chars?
字符串剪切 字符串?符号?
返回一个除了删除出现在字符串首尾的字符,其余都和原来一样的字符串。如果没有指定符号,那么空白(空格,tab,换行和回车)会被删除。在我刚开始写iRules的时候,我并不理解这些,以及trimleft和trimright。trimleft和trimright分别用来删除串首和串尾的字符,但trim可以同时删除首尾的字符。这里有些Shell下的例子来解释这一行为:
% set a ". this is a string ."
. this is a string .
% string trim $a .
this is a string # notice the . was trimmed, but not the whitespace注意.被剪切掉了,但是空格没有
% string trim [string trim $a .] " "
this is a string # now the whitespace has been trimmed (both leading and trailing)现在首和尾的空格都被剪切了
% string trim [string trim $a .]
this is a string # same as before, the " " isn't necessary, removed by default when ?chars? isn't specified 和上面的例子一样,只是没有必要使用“ ”,不指定符号时候一样可以默认的进行删除。
% set b [string trim ]string trim $a .[]<EOS>
this is a string<EOS> # Just added <EOS> to show the whitespace has in fact been trimmed from the trailing end of the string 添加了一个<EOS>来显示字符串末尾的空格的确是被去掉了。
%
Trimleft和trimright的工作方式是一样的。他们在匹配时并不剪切字符串首尾的字符,而是将匹配上的字符删掉。这里有一个Colin的例子,他用trimleft命令删除了路径中的第一个字符。需要注意的是,我们在上面那个使用字符串范围的例子里也解决了同样的问题。你将会遇到的问题中的大部分都是有多种解决方法的,在这个例子中,路径是指定的,这就使得Rules要比字符串范围的命令更简单,尤其是你所有的路径都以/xyz/开始的时候。
when HTTP_REQUEST {
if {[HTTP::host] contains "soa"} {
if {[HTTP::uri] starts_with "/prd/"} {
HTTP::uri [string trimleft ]HTTP::uri[ /prd]
pool POOL_SOA_PRD
}
if {[HTTP::uri] starts_with "/ppd/"} {
HTTP::uri [string trimleft ]HTTP::uri[ /ppd]
pool POOL_SOA_PPD
} else {
# THIS IS ONLY HERE SO THAT THEY CAN KEEP TESTING
pool POOL_SOA_PRD
}
}
}
发表评论
-
Tcl 基础知识精华20句
2011-03-30 09:47 1435最近在巩固Tcl的基础知 ... -
Tcl/Tk--文件操作
2011-03-29 17:41 2776wikibook上的文章很有水平,特翻译出来,晒晒。(译自wi ... -
tcl中如何产生随机数
2011-03-25 14:27 2334[前言] 亂數產生器在NS2中是非常重要的, ... -
TCL 取时间、格式化时间
2011-03-25 14:03 3730clock seconds 取一个整型值 用命令可以格式化时 ... -
Visual Tcl Binary 完整版(完美中文支持)
2011-03-22 17:24 1928Visual Tcl Binary 是我为可视化开发工具 Vi ... -
windows tcl/tk安装(塔卡)
2011-03-22 17:15 3457在Windows中,最简单的方 ... -
ASED Tile for Linux/Windows 正式发布。
2011-03-22 16:42 1369ASED Tile 项目主页: http://co ... -
正式发布 Visual Tcl Binary 1.6.1 加强版
2011-03-22 16:41 1231Visual Tcl Binary 1.6.1 版 ... -
Tcl/Tk 开发者的常备编程工具
2011-03-22 16:38 2639工欲善其事,必先利其器”,选择正确的工具,可以让 Tcl/Tk ... -
Tcl/Tk 在 Windows XP 系统中的 pixmap 错误。
2011-03-22 16:36 976Tc/Tk,Ubuntu 7.04,中文缺字 在程序 ... -
Tcl/Tk Web Browser Plugin v3
2011-03-22 16:35 1064相信大家一定非常熟悉 Java Applet,许多网页的特效就 ... -
如何将 *.tcl *.tbc 文件转换为 Linux/Windows 二进制可执行文件。
2011-03-22 16:32 3209=============================== ... -
Visual Tcl Binary for Linux/Windows 完整版发布。
2011-03-22 16:27 1425Visual Tcl Binary 项目主页: http ... -
tcl 小技巧
2011-03-21 14:51 9311,expr 【expr arg ?arg ...?】可以有一 ... -
Tcl语言cmdline包
2011-03-21 14:51 1384Cmdline包主要用来处理命令行输入。 getopt ... -
Tcl语言包搜索机制
2011-03-21 14:51 1058“pkg_mkIndex”是一个Tcl命令,它用来建立包索引, ... -
Tcl语言自动加载机制
2011-03-21 14:49 1151“pkg_mkIndex”是一个Tcl ... -
tcl/tk/expect(转)
2011-03-21 14:49 962Tcl pronounced &quo ... -
Tcl编程简介(六)
2011-03-21 14:42 846lsort -mode list 排列列表。 -mode ... -
Tcl编程简介(五)
2011-03-21 14:42 1009Error命令 error message ...
相关推荐
输入参数:a待替换文件的路径、b需要替换的字符串、c进行替换的字符串,功能:将文件A中的b替换为c。
TCL 字符串操作:TCL 提供了丰富的字符串操作功能,包括字符串连接、字符串查找、字符串替换等。 TCL/TK 是一种功能强大且广泛应用的脚本语言,TK 是 TCL 的图形用户界面扩展。TCL/TK 广泛应用于嵌入式系统、Web ...
TCL(Tool Command Language)练习题及答案; 1、编写一个TCL脚本,输出从1到10的所有偶数。 2、编写一个TCL脚本,求一个整数列表的平均值。... 16、将一个字符串中的所有元音字母替换为指定的字符。 .......
正则表达式,一个处理符合某些复杂规则的字符串的强大工具, 正则表达式是在1956 年的时候,人类最早研究神经网络的产物
以下将根据提供的部分章节内容,深入解析TCL中的字符串处理、正则表达式、错误捕捉以及流程控制等关键知识点。 ### 第一章:字符串操作 #### 1. 字符串基础操作 - **`append`**:用于向现有字符串添加新内容。 -...
- 字符串操作:Tcl提供了丰富的字符串操作命令,如截取、替换、拼接等,便于进行文本处理。 总的来说,《Tcl / Tk 大全》是学习和理解Tcl/Tk语言的重要参考资料,它不仅涵盖了语言的基础知识,也探讨了高级主题,...
- **string replace**:替换字符串中的部分。 - **string tolower/toUpper**:转换字符串大小写。 - **string trim/left/right**:去除字符串前后空格或指定字符。 #### 文件访问 - **文件名**:文件路径表示。 ...
TCL的字符串处理功能强大,内置了多种操作命令,如`string length`、`string trim`、`regsub`等,可以方便地进行字符串的查找、替换、分割等操作。 在TCL中,数组也是动态定义的,可以使用`array set`来创建数组,`...
- **string replace**:替换字符串中的部分字符。 - **string tolower**:转换为小写字母。 - **string toupper**:转换为大写字母。 - **string trim**:去除字符串两端的空白字符。 - **string trimleft**:去除...
3. **字符串操作**:TCL提供了丰富的字符串处理命令,如`append`用于连接字符串,`string length`获取字符串长度,`regsub`进行正则表达式替换。 4. **控制结构**:TCL支持条件语句(`if-else`)、循环语句(`for`...
2. **字符串处理**:TCL的强项在于字符串处理,教程可能会深入讲解字符串的拼接、查找、替换等操作。 3. **数组**:TCL中的数组是键值对存储的数据结构,教程会解释如何声明、访问和修改数组元素。 4. **文件操作**...
- **字符串操作**:可以使用各种命令来处理字符串,如字符串长度、查找和替换等。 - **数学表达式**:通过`expr`命令可以执行基本的算术运算。 - **条件判断**:`if`命令用于根据条件执行不同的代码块。 - **列表...
2. **字符串操作**:Tcl提供了丰富的字符串操作命令,如`string length`计算字符串长度,`string trim`去除字符串两端的空白,`string replace`替换子字符串等。 3. **数组**:Tcl的数组可以存储多个关联值,如`...
- `""` 和 `{}`: 字符串替换。 - 示例:`puts "Value of x is $x"` 4. **转义字符 `\`:** 用于转义某些特殊字符。 - 示例:`puts "\nNew line"` (输出换行) #### 四、数学表达式与EXPR命令 1. **EXPR命令:**...
TCL中的字符串操作是非常核心的功能,这一版本在原有的基础上增加了更多的字符串函数,使得对字符串的拼接、分割、查找和替换等操作更加便捷。同时,对于正则表达式的支持也得到了加强,这对于数据处理和文本解析...
3. 字符串替换:`string map`命令可以进行字符串的查找替换。 四、列表处理 1. 列表创建:通过`list`命令或逗号分隔的方式创建。 2. 列表操作:如`lindex`, `lappend`, `llength`, `lsearch`等命令用于访问、添加...
- **4.7.4 字符串替换**:使用`string map`命令进行字符串替换。 - **4.7.5 字符类别(class)测试**:使用`string is`命令测试字符类别。 - **4.7.6 字符串映射**:使用`string map`命令实现字符串的映射功能。 ####...
总结来说,TCL是一种非常灵活且强大的脚本语言,其核心特性包括命令组成的程序、命令替换、变量替换、组以及一切皆字符串的设计理念。这些特性使得TCL非常适合自动化任务、网络管理和GUI编程等多种应用场景。