在 Tcl 教程的这一部分中,我们将更详细地处理字符串数据。 字符串是计算机语言中的一种重要数据类型。
字符串是字符序列。 与其他语言不同,Tcl 中的字符串不必总是用双引号引起来。 仅当单词之间有空格时,它们才是必需的。 Tcl 是基于字符串的语言。 它提供了一组丰富的用于处理字符串的命令。
第一个例子
下面是一个显示一些字符串的简单示例。
#!/usr/bin/tclshputs Tclputs Javaputs Falconputs "Tcl language"puts {Tcl language}
该脚本将一些字符串值打印到控制台。
puts Tclputs Javaputs Falcon
Tcl 中的字符串不必总是用引号引起来。
puts "Tcl language"puts {Tcl language}
Tcl 中的字符串可以用双引号或大括号括起来。
$ ./simple_strings.tclTclJavaFalconTcl languageTcl language
这是simple.tcl脚本的输出。
使用引号
如果我们想在直接演讲中显示报价该怎么办? 在这种情况下,必须对内引号进行转义。
$ cat directspeech.tcl#!/usr/bin/tclshputs "There are many stars"puts "He said, \"Which one is your favourite?\""
我们使用\字符转义其他引号。
$ ./directspeech.tclThere are many starsHe said, "Which one is your favourite?"
directspeech.tcl程序的输出。
多行字符串
在 Tcl 中创建多行字符串非常容易。 在创建多行字符串的许多其他语言中,我使用起来不那么方便。
#!/usr/bin/tclshset lyrics "I cheated myselflike I knew I wouldI told ya, I was troubleyou know that I'm no good"puts $lyrics
我们简单地继续下一行。 如果我们想显示经文,这很有用。
$ ./multiline.tclI cheated myselflike I knew I wouldI told ya, I was troubleyou know that I'm no good
比较字符串
字符串的基本比较可以通过string compare命令完成。
#!/usr/bin/tclshputs [string compare 12 12]puts [string compare Eagle Eagle]puts [string compare Eagle eagle]puts [string compare -nocase Eagle eagle]
string compare命令逐字符比较字符串。 如果发现两个字符串的第一个字符相等,则继续第二个字符,直到结尾。 如果字符串相等,则返回 0;如果第一个字符串中的不匹配字符位于 ASCII 表中的第二个字符串之前,则返回 -1。 如果第一个字符串的不匹配字符位于第二个字符串的字符之后,则返回 1。
puts [string compare 12 12]
在这种情况下,12 是字符串。
puts [string compare Eagle Eagle]
两个字符串相等,将 0 打印到控制台。
puts [string compare Eagle eagle]
E位于e之前,因此返回-1。
puts [string compare -nocase Eagle eagle]
使用-nocase选项,我们将忽略大小写。 这两个字符串相等。
$ ./compare.tcl00-10
程序的输出。
string equal也可以用来比较字符串。 如果字符串相等,则命令返回 1,否则返回 0。
#!/usr/bin/tclshset str1 Tclset str2 "Tcl language"puts [string compare $str1 $str2]puts [string compare -length 3 $str1 $str2]puts [string equal $str1 $str2]puts [string equal -length 3 $str1 $str2]
该脚本显示了两个比较字符串的命令。
puts [string compare $str1 $str2]
该行打印 -1。 前三个位置的字符相等。 在第四个位置,string compare命令将空格与l字符进行比较。 该空格位于 ASCII 表中的l字符之前。 字符串不相等。
puts [string compare -length 3 $str1 $str2]
在这种情况下,我们将比较限制为前三个字符。 它们在两个字符串中都相同,因此命令返回 0。
puts [string equal $str1 $str2]
这两个字符串不相同,因此string equal命令返回 0,表示为false。
puts [string equal -length 3 $str1 $str2]
将字符串限制为前三个字符,该命令返回 1。这意味着直到前三个字符为止它们都是相同的。
模式匹配
对于简单的模式匹配-球形-我们可以使用string match命令。 对于更强大的模式匹配,我们可以利用regexp命令。
#!/usr/bin/tclshputs [string match book???? bookcase]puts [regexp {[a-z]{3}} "abc"]puts [regexp {[^a-z]{3}} "abc"]puts [regexp book(shelf|worm) bookworm]
该示例演示了string match和regexp命令的用法。 对于匹配项,它们返回 1,对于不匹配项,返回 0。
$ ./string_match.tcl1101
string_match1.tcl程序的输出。
Unicode
我们可以在 Tcl 脚本中使用 Unicode 字符串。
#!/usr/bin/tclshputs "La femme vit par le sentiment, là où l'homme vit par l'action"puts "Анна Каренина"
我们将两个消息打印到终端。 第一是法语,第二是俄语。
$ ./unicode.tclLa femme vit par le sentiment, là où l'homme vit par l'actionАнна Каренина
输出。
字符串命令
Tcl 具有有用的内置命令,可用于处理字符串。
#!/usr/bin/tclshset str Eagleputs [string length $str]puts [string index $str 0]puts [string index $str end]puts [string range $str 1 3]
我们定义一个字符串变量并使用一些字符串命令。
puts [string length $str]
string length返回字符串中的字符数。
puts [string index $str 0]puts [string index $str end]
string index命令在特定位置返回字符。
puts [string range $str 1 3]
string range返回由第一个和最后一个索引选择的字符范围。
$ ./strings1.tcl5Eeagl
输出。
我们有一个split命令将字符串拆分为特定字符。 该命令返回单词列表。 可以使用join命令将这些单词组合成一个字符串。
#!/usr/bin/tclshset langs "Tcl,Java,C,C#,Ruby,Falcon"puts [split $langs ,]puts [join [split $langs ","] ":"]
在我们的程序中,我们将拆分并连接字符串。
set langs "Tcl,Java,C,C#,Ruby,Falcon"
这是我们将要拆分的字符串。 有几个单词,以逗号分隔。 逗号字符是用来分割字符串的字符。
puts [split $langs ,]
该行显示了我们从字符串中拆分出的所有单词。
puts [join [split $langs ","] ":"]
split命令返回字符串中的单词列表。 然后将这些词合并在一起。 单词现在将由冒号分隔。
$ ./splitjoin.tclTcl Java C C# Ruby FalconTcl:Java:C:C#:Ruby:Falcon
示例的输出。
接下来,我们将使用另一个带有几个字符串命令的示例。
#!/usr/bin/tclshset str "ZetCode"puts [string toupper $str]puts [string tolower $str]puts [string totitle $str]puts [string reverse $str]
我们介绍了四个字符串命令。 这些命令不会更改原始字符串。 它们返回一个新的,经过修改的字符串。
puts [string toupper $str]
我们将字符转换为大写。
puts [string tolower $str]
我们将字符串的字母转换为小写。
puts [string totitle $str]
string totitle返回一个字符串,其首字母大写; 其他字符均为小写。
puts [string reverse $str]
我们使用string reverse命令反转字符串的字符。
$ ./strings2.tclZETCODEzetcodeZetcodeedoCteZ
运行程序。
格式化字符串
字符串的最基本格式在引号内完成。
#!/usr/bin/tclshset oranges 2set apples 4set bananas 3puts "There are $oranges oranges, $apples apples and\$bananas bananas. "
Tcl 用双引号求值变量。
puts "There are $oranges oranges, $apples apples and\$bananas bananas. "
在此代码行中,我们将变量和字符串组合在一个句子中。
$ ./fruit.tclThere are 2 oranges, 4 apples, and 3 bananas.
输出。
可以使用format命令完成更高级的格式化。 它具有以下概要:
format formatString ?arg arg ...?
formatString用于控制参数的显示方式。 该命令可以使用多个参数。
#!/usr/bin/tclshputs [format %s "Inception movie"]puts [format "%d %s" 23 songs]
这是基本脚本,显示format命令的用法。
puts [format %s "Inception movie"]
该行仅将字符串输出到控制台。
puts [format "%d %s" 23 songs]
在这里,我们打印两个参数。 每个参数都有一个格式说明符,该说明符以%字符开头。
$ ./basicformat.tclInception movie23 songs
输出。
现在,我们显示format命令的一些基本转换说明符。 %s,%f,%d和%e是转换类型。 它们控制如何显示值。 转换类型是转换说明符的唯一必需部分。
#!/usr/bin/tclshputs [format "%s" "Tcl language"]puts [format "%f" 212.432]puts [format "%d" 20000]puts [format "%e" 212.342]
我们将在终端上打印四则消息。
puts [format "%s" "Tcl language"]
%s是字符串的转换类型。
puts [format "%f" 212.432]
%f用于显示十进制数字。
puts [format "%d" 20000]
要打印整数值,我们使用%d转换类型。
puts [format "%e" 212.342]
%e用于以科学格式显示数字。
$ ./format.tclTcl language212.432000200002.123420e+02
输出。
在下一个示例中,我们将以三种不同的数字格式设置数字格式。
#!/usr/bin/tclshputs [format "%-10s %-14s %s" Decimal Hexadecimal Octal]puts [format "%-10d %-14x %o" 5000 5000 5000]puts [format "%-10d %-14x %o" 344 344 344]puts [format "%-10d %-14x %o" 55 55 55]puts [format "%-10d %-14x %o" 9 9 9]puts [format "%-10d %-14x %o" 15666 15666 15666]
我们以十进制,十六进制和八进制格式打印数字。 我们还将数字对齐三列。
puts [format "%-10d %-14x %o" 5000 5000 5000]
%-10d适用于第一个数字,%-14x适用于第二个数字,%o适用于第三个数字。 我们将描述第一个。 格式说明符以%字符开头。 负号-表示如果该值短于字段宽度,则将其对齐。 其余字段填充空白。 数字 10 指定字段宽度。 最后,d字符表明数字以十进制格式显示。 x代表十六进制,o代表八进制。
$ ./numbers.tclDecimal Hexadecimal Octal5000 1388 11610344 158 53055 37 679 9 1115666 3d32 36462
运行示例。
最后,我们将格式化日期和时间数据。 我们使用clock format命令。
#!/usr/bin/tclshset secs [clock seconds]puts "Short date: [clock format $secs -format %D]"puts "Long date: [clock format $secs -format "%A, %B %d, %Y"]"puts "Short time: [clock format $secs -format %R]"puts "Long time: [clock format $secs -format %r]"puts "Month: [clock format $secs -format %B]"puts "Year: [clock format $secs -format %Y]"
前面的示例演示了一些常见的日期和时间格式。
set secs [clock seconds]
我们以秒为单位获取当前时间戳。 此值随后传递给clock format命令,以使人类可以读取日期和时间。
puts "Short date: [clock format $secs -format %D]"
日期格式由-format选项控制。 有几种说明符。 %D以月/日/年格式返回日期。
$ ./clockformat.tclShort date: 04/11/2011Long date: Monday, April 11, 2011Short time: 11:30Long time: 11:30:30 amMonth: AprilYear: 2011
输出。
Tcl 教程的这一部分介绍了字符串。
