【丑帅的 Perl】奇怪的字符串

8 篇文章 0 订阅

【丑帅的 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 中的字符串比较是不能用 ==<==< 来做逻辑运算的,而是要用gtlteq 来做判断,但是我们不妨试一试用 ==<==< 到底比较的是什么

$str1 = "hello";
$str2 = "world";

if($str1 == $str2){
    print "Equals";
} else {
    print "Not equals";
}

发现输出的永远是 Equals

这是为什么呢?

考虑 ==<==< 是数字标量的操作符,因此这里会有一个隐式的类型转换,尝试把字符串转为数字标量,还记得开头的转换规则吗,这里全都会转换为 0,于是进入 true 分支

所以用 ==<==< 来做字符串的比较是很不安全的。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值