我喜欢json作为我编写的软件配置文件的格式.我喜欢它轻巧,简单,并得到广泛支持.但是,我发现在json中有一些我真的很喜欢它没有的东西.
Json没有多行字符串或这里的文档(http://en.wikipedia.org/wiki/Here_document),当你希望你的json文件是人类可读和可编辑的时候,这通常很尴尬.您可以使用字符串数组,但这是一个kludgy解决方法.
Json不允许评论.
如果你看一下unix配置文件的格式,你会看到很多人为自己设计自己笨拙的格式,使用某种通用的东西真的更有意义.例如,以下是Apache配置文件中的一些代码:
RewriteEngine on
RewriteBase /temp
RewriteCond %{HTTP_ACCEPT} application/xhtml\+xml
RewriteCond %{HTTP_ACCEPT} !application/xhtml\+xml\s*;\s*q=0
RewriteCond %{REQUEST_URI} \.html
RewriteCond %{THE_REQUEST} HTTP/1\.1
RewriteRule t\.html t.xhtml [T=application/xhtml+xml]
Run Code Online (Sandbox Code Playgroud)
本质上,这里发生的是他们发明了一种非常痛苦的方式来编写布尔函数f(w,x,y,z)= w&!x&y&z.你想要一个合乎逻辑的"或"?他们也有一些独立(丑陋)的机制.
这似乎指向的是某种数据描述语言,它简单且图灵不完整,但仍比json更具表现力,灵活性和方便性.有谁知道这样的语言?
根据我的口味,XML太复杂了,而且lisp表达式具有错误的功能(Turing-completeness)并且缺少正确的功能(这里是文档,表达语法).
[编辑]标题具有误导性.我对json的下一次迭代并不感兴趣.我对作为javascript子集的语言不感兴趣.我对其他数据描述语言感兴趣.
以下最小示例的输出显示(在我的linux机器上)File :: Glob似乎具有将utf8字符串转换为非utf8的意外副作用:
#!/usr/bin/perl
use utf8;
use strict;
my $x = "påminnelser";
my $y = glob $x;
print "x=",utf8::is_utf8($x),"=\n";
print "y=",utf8::is_utf8($y),"=\n";
Run Code Online (Sandbox Code Playgroud)
这导致我的程序出现错误行为.在linux上,看起来我可以通过在File :: Glob之后应用utf8 :: decode()来修复它.这是解决这个问题的正确方法吗?这是File :: Glob中的错误吗?我的修复程序是否会在Windows等其他系统上产生正确的结果?
问题是Ruby通过引用或值传递?吸引了很多有用的答案,也有很多不同意见.到目前为止,我在任何答案中都没有看到的是解释以下内容的任何内容:
ruby -e "def f(x) x=7 end; a=3; f(a); print a" 打印3.
ruby -e "def f(x) x[0]=7 end; a=[3]; f(a); print a[0]" 打印7.
根据经验,这看起来像标量对象和更复杂的对象(如散列和数组)之间存在某种区别,标量通过引用传递给值和复杂对象.这类似于C的语义.
我的理解是ruby中的所有东西都是一个对象,而早期问题的答案都没有提到标量和复杂类型之间的区别.那么我的描述是错误的,如果是,那么更好的描述是什么?
installation ×1
json ×1
module ×1
perl ×1
python ×1
python-wheel ×1
ruby ×1
unicode ×1
utf-8 ×1