12

我知道的每一种编程语言(Perl、Javascript、PHP、Python、ASP、ActionScript、Commodore Basic)都使用单引号和双引号来分隔字符串

这造成了必须竭尽全力正确处理引号的持续情况,因为引号在字符串的内容中非常常见。

为什么编程语言不使用其他字符来分隔字符串,通常对话中不使用的字符\, | 或 { }例如)这样我们就可以继续我们的生活了吗?

这是真的,还是我忽略了什么?有没有一种简单的方法可以停止在现代编程语言中对字符串使用引号?

print <<<END
我知道这里的文档语法,但是对于较小的字符串操作,它过于复杂并且格式复杂。
结尾;

[更新]你们中的许多人都很好地说明了仅使用 ASCII 字符的重要性。我已经更新了示例以反映这一点(反斜杠管道大括号)。

4

14 回答 14

12

Perl 允许你使用任何你喜欢的字符

 "foo $bar" eq
 qq(foo $bar) eq
 qq[foo $bar] eq
 qq!foo $bar! eq
 qq#foo $bar# etc

Meanwhile
 'foo $bar' eq
 q(foo $bar) eq
 q[foo $bar] eq
 q!foo $bar! eq
 q#foo $bar# etc

语法扩展到其他功能,包括正则表达式,如果您正在处理 URI,这很方便。

 "http://www.example.com/foo/bar/baz/" =~ /\/foo/[^\/]+\/baz\//;
 "http://www.example.com/foo/bar/baz/" =~ m!/foo/[^/]+/baz/!;
于 2009-06-08T15:28:35.643 回答
8

当前:“打字机”“引号”标记

使用我们目前使用的引号有很多很好的理由:

  • 引号很容易在键盘上找到- 所以它们很容易输入,而且它们必须很容易,因为经常需要字符串。

  • 引号是 ASCII - 大多数编程工具只能处理好 ASCII。您可以在几乎任何可以想象的环境中使用 ASCII。当您在某个遥远的服务器中通过 telnet 连接修复程序时,这一点很重要。

  • 引号有很多版本——单引号、双引号、反引号。因此,一种语言可以为不同引用的字符串分配不同的含义。这些不同的引号也可以解决“引号内”的问题。

  • 引号是自然的——早在编程语言出现之前,英语就使用引号来标记文本段落。在语言学中,引号的使用方式与编程语言中的使用方式完全相同。引号是自然的,就像 + 和 - 对于加法和减法一样自然。

替代方案:“排版”“正确”引号

从技术上讲,它们是优越的。一大优势是您可以轻松区分开盘价和收盘价。但是它们很难输入,而且它们不是 ASCII。(我必须把它们放在标题中,才能让它们在 StackOverflow 字体中可见。)

希望有一天,当 ASCII 成为只有历史学家关心的东西并且键盘已经变成完全不同的东西(如果我们甚至要拥有键盘的话)时,将会出现一种使用更好引号的编程语言......

于 2009-06-08T16:39:23.500 回答
5

Python 确实有一个带有三双引号“”“Some String”“”的替代字符串分隔符。

大多数语言都使用单引号和双引号,因为这是大多数书面语言的标准分隔符。

于 2009-06-08T15:27:43.837 回答
4

语言(应该)尽量简单易懂,并且使用与引号不同的东西来处理字符串会引入不必要的复杂性。

于 2009-06-08T15:26:13.200 回答
3

使用引号将一组字符定义为与封闭文本分开对我们来说更自然,因此更易于阅读。另外," 和 ' 在键盘上,而您提到的其他字符没有,因此更容易键入。也许可以使用键盘上广泛使用的字符,但我想不出一个赢了没有同样的问题。

E:我错过了管道字符,这实际上可能是一个可行的选择。除了它目前被广泛用作 OR 运算符之外,可读性问题仍然存在。

于 2009-06-08T15:27:49.860 回答
3

因为您列出的其他字符不是 ASCII。我不确定我们是否已经准备好,或者需要一种 unicode 编程语言......

编辑:至于为什么不使用 {},| 或\,这些符号在大多数语言中都已经具有含义。想象一下 C 或 Perl 对 '{' 和 '}' 有两种不同的含义!

| 表示或,并且在某些语言中已经连接字符串。如果 \ 是分隔符,您将如何获得 \n?

从根本上说,我真的不明白为什么这是一个问题。\" 真的那么难吗?我的意思是,在 C 语言中,你经常需要使用 \%、\ 和其他几个两个字符的字符,所以......嗯。

于 2009-06-08T15:31:38.260 回答
3

Python 有一个额外的字符串类型,使用三重双引号,

"""like this"""

除此之外,Perl 允许你使用任何你想要的分隔符,

q^ like this ^

我认为在大多数情况下,使用常规字符串分隔符是因为它们有意义。字符串用引号括起来。除此之外,大多数开发人员习惯于使用他们的常识来处理字符串,从而彻底改变字符串的呈现方式可能是一个困难的学习曲线。

于 2009-06-08T15:33:24.637 回答
3

啊,所以你想要老式的 FORTRAN,你可以通过计算字符串中的字符数并将其嵌入 H 格式来引用,例如: 13HHello, World!. 作为在语言名称全部大写的日子里用 FORTRAN 做一些事情的人,引号和转义它们是一件好事。(例如,如果您的手动字符数少了一个,您并没有完全搞砸。)

说真的,没有理想的解决方案。在某些时候,总是有必要拥​​有一个包含您喜欢的任何引号字符的字符串。出于实际目的,引号分隔符需要在键盘上并且易于访问,因为它们被大量使用。q@...@如果字符串包含每个可能字符的示例,Perl 的语法将失败。FORTRAN 的 Hollerith 常数更差。

于 2009-06-08T15:42:03.667 回答
2

因为没有人使用其他流行的字符创建一种语言。

我认为这很大程度上是因为改变角色的需求并不存在,大多数程序员已经习惯了标准的报价,并且看不到改变现状的令人信服的理由。

比较以下。

print "This is a simple string."
print "This \"is not\" a simple string."

print ¤This is a simple string.¤
print ¤This "is not" a simple string.¤

我真的不觉得第二个更容易或更易读。

于 2009-06-08T15:26:27.460 回答
2

您说“必须竭尽全力正确处理引号”;但它只存在于文本表示中。所有现代语言都将字符串视为二进制块,因此它们实际上并不关心内容。请记住,文本表示只是程序员告诉系统该做什么的一种简单方式。一旦字符串被保留,管理引号就没有任何问题了。

于 2009-06-08T15:51:02.043 回答
2

一个很好的理由可能是,如果这是您想要改进现有语言的唯一事情,那么您并没有真正创建一种新语言。

而且,如果您正在创建一种新语言,那么为字符串引号选择正确的字符可能是在实际实现的待办事项列表中的一种方式。

于 2009-06-08T16:43:02.030 回答
1

您可能最好选择一个存在于所有常见键盘和终端表示集上的分隔符,所以您建议的大多数都是正确的......

无论如何,引用机制仍然是必要的……您可以减少使用引用的次数,但代价是使非专业人士更难阅读该语言。

所以不完全清楚这是一场胜利,然后是习惯的力量。

于 2009-06-08T15:30:10.493 回答
1

Ada 不对字符串使用单引号。这些仅用于字符,不必在字符串中转义。

我发现双引号字符很少出现在我输入计算机程序的普通文本字符串中。当它发生时,几乎总是因为我将该字符串传递给命令解释器,并且需要在其中嵌入另一个字符串。

我想这些其他字符都没有用于字符串分隔符的主要原因是它们不在原始的 7 位 ASCII 代码表中。现在这可能不是一个好的借口,但是在一个大多数语言设计者都害怕反对疯狂蹩脚的 C 语法的世界里,你不会因为一个不寻常的字符串分隔符选择而得到很多人。

于 2009-06-08T15:51:02.323 回答
1

Python 允许您混合单引号和双引号在字符串中放置引号。

print "Please welcome Mr Jim 'Beaner' Wilson."
>>> Please welcome Mr Jim 'Beaner' Wilson.

print 'Please welcome Mr Jim "Beaner" Wilson.'
>>> Please welcome Mr Jim "Beaner" Wilson

您还可以使用前面提到的三引号。这些也延伸到多行,让您也不必打印换行符。

print """Please welcome Mr Jim "Beaner" Wilson."""
>>> Please welcome Mr Jim "Beaner" Wilson

最后,您可以像其他人一样打印字符串。

print "Please welcome Mr Jim \"Beaner\" Wilson."
>>> Please welcome Mr Jim "Beaner" Wilson
于 2009-06-08T16:29:46.813 回答