【丑帅的 Perl】奇怪的字符串
无所谓的解释
看上去很久都没有写博客了。其中有两个原因,第一是实在没有时间(无奈),第二是感觉没有碰到需要写下来的东西,今天碰到 perl 中的字符串标量,让我觉得有写下来的必要。
正文
都说 perl 丑,写出来的代码几个月后自己都不认识,在 perl 中,确实有许多奇奇怪怪的语法,比如 perl 中字符串与数字标量之间的隐式的转换。比如看下面一个例子:
"2perl" * 3
用惯性思维猜一下里面的值是多少呢?是会抛出运行时异常吗?还是执行下去是无法解释的值。啊,都不是,是 6。
perl 在解释到这个字符串的时候,发现它做了一个 *
的运算操作,于是尝试把它转换成数字标量,转换的规则很简单,也有点奇怪,当前面是数字后面是字符时,这时候会把遇到的第一个字符的下标作为起点,往后直到字符串的尾部全部截去不管,于是 2perl
转换为数字标量是 2,于是结果就是 6 了。
如果把目标字符串换成perl2
,perl 的解释器发现首先遇到的是字符,那就直接转换为 0 了,于是
"perl2" * 3
上面的结果为 0。
单引号和双引号
这两个东西在不同语言中有不同的含义,这些都留给对应的编译器/解释器来解释吧!
在 perl 中,单引号没有强大的转义解析,适合你只想输出纯净的字符串的场景,比如
print 'hello\n'; # hello\n%
你会发现真的打印了 "hello\n"
,\n
并没有被转义。
双引号与单引号相反,它有强大的转义解析,对\
反斜杠有特殊的含义,与此同时,它还能作为模版字符串来使用
$msg = 'hello';
print "$msg\n"; # hello
发现输出的是hello
与此同时 perl
的字符串标量还有一些实用但是可能平时不怎么会注意的操作符
. 操作符
类似于其他语言中 string 的 concat,但是语义不是那么的强,但是却很好用
'hello' . 'world' # helloworld
x 操作符
很多时候会需要遇到需要 repeat 字符串的时候
'hello' x 3 # hellohellohello
条件语句
perl 中的字符串比较是不能用 ==
, <=
,=<
来做逻辑运算的,而是要用gt
,lt
,eq
来做判断,但是我们不妨试一试用 ==
, <=
,=<
到底比较的是什么
$str1 = "hello";
$str2 = "world";
if($str1 == $str2){
print "Equals";
} else {
print "Not equals";
}
发现输出的永远是 Equals
这是为什么呢?
考虑 ==
, <=
,=<
是数字标量的操作符,因此这里会有一个隐式的类型转换,尝试把字符串转为数字标量,还记得开头的转换规则吗,这里全都会转换为 0,于是进入 true 分支
所以用 ==
, <=
,=<
来做字符串的比较是很不安全的。