Tcl 中的字符串
最后修改于 2023 年 10 月 18 日
在本 Tcl 教程中,我们将更详细地研究字符串数据。字符串是计算机语言中一种重要的数据类型。
字符串是由字符组成的序列。Tcl 中的字符串,与其他语言不同,不必总是用双引号括起来。只有在单词之间有空格时,才需要使用双引号。Tcl 是一种基于字符串的语言。它提供了一组丰富的命令来操作字符串。
第一个示例
下面是一个展示一些字符串的简单例子。
#!/usr/bin/tclsh puts Tcl puts Java puts Falcon puts "Tcl language" puts {Tcl language}
此脚本将一些字符串值打印到控制台。
puts Tcl puts Java puts Falcon
Tcl 中的字符串不必总是用引号括起来。
puts "Tcl language" puts {Tcl language}
Tcl 中的字符串可以用双引号或花括号分组。
$ ./simple_strings.tcl Tcl Java Falcon Tcl language Tcl language
使用引号
如果我们要显示引号,例如,在直接引语中,该怎么办?在这种情况下,必须转义内部引号。
$ cat directspeech.tcl #!/usr/bin/tclsh puts "There are many stars" puts "He said, \"Which one is your favourite?\""
我们使用 \
字符来转义额外的引号。
$ ./directspeech.tcl There are many stars He said, "Which one is your favourite?"
多行字符串
在 Tcl 中创建多行字符串非常容易。在许多其他语言中,创建多行字符串不太方便。
#!/usr/bin/tclsh set lyrics "I cheated myself like I knew I would I told ya, I was trouble you know that I'm no good" puts $lyrics
我们只需继续在下一行。如果我们想显示诗句,这很有用。
$ ./multiline.tcl I cheated myself like I knew I would I told ya, I was trouble you know that I'm no good
比较字符串
可以使用 string compare
命令进行字符串的基本比较。
#!/usr/bin/tclsh puts [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.tcl 0 0 -1 0
string equal
也可以用来比较字符串。如果字符串相等,则该命令返回 1,如果它们不相等,则返回 0。
#!/usr/bin/tclsh set str1 Tcl set 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/tclsh puts [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.tcl 1 1 0 1
Unicode
我们可以在 Tcl 脚本中使用 Unicode 字符串。
#!/usr/bin/tclsh puts "La femme vit par le sentiment, là où l'homme vit par l'action" puts "Анна Каренина"
我们将两条消息打印到终端。第一条是法语,第二条是俄语。
$ ./unicode.tcl La femme vit par le sentiment, là où l'homme vit par l'action Анна Каренина
输出。
字符串命令
Tcl 有有用的内置命令,可用于处理字符串。
#!/usr/bin/tclsh set str Eagle puts [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.tcl 5 E e agl
输出。
我们有一个 split
命令,用于在特定字符处拆分字符串。该命令返回一个单词列表。这些单词可以使用 join
命令组合成一个字符串。
#!/usr/bin/tclsh set 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.tcl Tcl Java C C# Ruby Falcon Tcl:Java:C:C#:Ruby:Falcon
接下来我们有另一个带有几个字符串命令的示例。
#!/usr/bin/tclsh set 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.tcl ZETCODE zetcode Zetcode edoCteZ
运行该程序。
格式化字符串
字符串的基本格式化是在引号内完成的。
#!/usr/bin/tclsh set oranges 2 set apples 4 set bananas 3 puts "There are $oranges oranges, $apples apples and\ $bananas bananas. "
Tcl 在双引号中评估变量。
puts "There are $oranges oranges, $apples apples and\ $bananas bananas. "
在这行代码中,我们将变量和字符串组合成一个句子。
$ ./fruit.tcl There are 2 oranges, 4 apples, and 3 bananas.
输出。
更高级的格式化可以使用 format
命令完成。它具有以下概要
format formatString ?arg arg ...?
formatString 用于控制将如何显示参数。该命令可以接受多个参数。
#!/usr/bin/tclsh puts [format %s "Inception movie"] puts [format "%d %s" 23 songs]
这是一个显示 format
命令用法的基本脚本。
puts [format %s "Inception movie"]
此行只是将字符串打印到控制台。
puts [format "%d %s" 23 songs]
在这里我们打印两个参数。每个参数都有一个格式说明符,它以 %
字符开头。
$ ./basicformat.tcl Inception movie 23 songs
输出。
现在我们展示 format
命令的一些基本转换说明符。%s
、%f
、%d
、%e
是转换类型。它们控制如何显示值。转换类型是转换说明符的唯一强制部分。
#!/usr/bin/tclsh puts [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.tcl Tcl language 212.432000 20000 2.123420e+02
输出。
在下一个示例中,我们将以三种不同的数字格式格式化数字。
#!/usr/bin/tclsh puts [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.tcl Decimal Hexadecimal Octal 5000 1388 11610 344 158 530 55 37 67 9 9 11 15666 3d32 36462
运行示例。
最后,我们格式化日期和时间数据。我们使用 clock format
命令。
#!/usr/bin/tclsh set 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.tcl Short date: 04/11/2011 Long date: Monday, April 11, 2011 Short time: 11:30 Long time: 11:30:30 am Month: April Year: 2011
输出。
Tcl 教程的这一部分涵盖了字符串。