数值和字符串

数值

  • perl中以双精度(浮点数)方式保存和运算数值的方式

就算写的是整数,在内部也会转换成等效的浮点数类型保存。

但在perl内部,有些运算会将浮点数转换成整型进行,而且也有integer编译器可以强制编译成整型。

  • perl中整数的表示方式

有3种方式:

123
0123
61_123_234

这里使用下划线(_)代替逗号表示千分位,因为perl中逗号有特殊意义。

  • 算术运算
+ - * / % **

**的优先级在这里最高。

取模时,先两个数取整,再取模。例如5.2 % 2.1等价于5 % 2

多个取幂符号时,**的优先级是从右向左进行的。

3 ** 4 ** 2   # 3 ** (4 ** 2) = 3的16次方

单双引号和反引号

perl对待单双引号的方式和shell有点类似。

  • 单引号内,只有反斜线的转义效果存在(如\n不再是换行),其它全都当作字面符号(单引号自身除外)
  • 双引号内,反斜线、反斜线序列(\n,\t...)、变量替换都允许
  • 反引号内,内容会交给shell执行
'malong'
'malong\'s girl friend'
'malong\n' # 这里没有换行
"malong\n" # 换行了
'malong
girl friend' # 换行了,因为这里的换行是字面符号,不是\n
'malong\\n' # 换行了
"malong $var" # 变量替换

有以下反斜线序列(转义序列):

\n
\r
\t
\l # 将下个字母转换为小写
\L # 将后面的多个字母都转换为小写,直到遇到\E
\u # 将下个字母转换为大写
\U # 将后面的多个字母都转换为大写,直到遇到\E
\Q # 和\E之间的所有字符都强制当作字面符号
\E # \L、\U和\Q的结束符号

但即使没有"\E",到了字符串结束的地方,转义序列就会结束。例如:

print "\Uabc"."xyz\n"    # 输出ABCxyz
print "abc"."x\Eyz\n" # 输出abcxyz

反引号内的字符串会交给shell执行。这是和操作系统交互的一种方式,支持操作系统的管道、重定向等特性。另一种方式是使用system函数。

$mydatetime = `date +"%F %T"`
print $mydatetime,"\n";

默认情况下,反引号内的内容会被perl先按照双引号的方式进行解析,然后传递给操作系统的shell执行。所以,当有变量替换时会进行变量替换:

$name="malongshuai";
$msg=`echo $name`; # 替换为echo malongshuai,然后交给shell
print $msg;

如果不想先被perl解析,可以使用qx和单引号结合的方式,关于qx,见下文。

$name="malongshuai";
$msg=qx'echo ha $name hei'; # 不会替换为malongshuai,而是将$name替换为空交给shell
print $msg;

引号的文本形式:q、qq和qx

  • q等价于单引号
  • qq等价于双引号
  • qx等价于反引号
q(hello world)        # 等价于'hello world'
qq(hello world) # 等价于"hello world"
qx(echo hello world) # 等价于`echo hello world`

上面的括号可以替换为其它符号,只要前后能配对(特指括号类)或者一致即可:

qq{ hello }
qq! hello !
qq# hello #
qq% hello %

字符串连接和重复

字符串连接使用点(.)。

下面是等价的:

abc.cde
abccde

字符串重复使用小写字母"x",后跟一个重复倍数。如果倍数是一个小数,如3.2,则会取整。如果倍数小于1,则取整为0,所以倍数为0,返回空。

"abc" x 3
"abc" x 3.2

都将输出"abcabcabc"。

"abc" x 0.4  # 返回空

"x"符号左边会强制转换为字符串。

03 x 3      # 返回333
"03" x 3 # 返回030303
3 x 3 # 返回333
3.2 x 3 # 返回3.23.23.2

数值和字符串的类型自动转换

什么时候转换,以及向哪个方向转换,取决于操作符。

例如,算数运算符(+-*/等)需要的是数值,会强制转换为数值。"."操作符需要的是字符串,会强制转换为字符串。

"0333" + 22  # 返回355
"033".22 # 返回03322
033.22 # 返回2722,033表示8进制,转换为十进制为27(3*8+3)

perl变态的一个地方,数值开头的字符串也可以强制转换为字符串。但只能转换数值开头(允许前导空白)的字符串。

"12abc" * 3      # 36
"abc12" * 4 # 0
" 12abc" * 3 # 36

两种类型的操作符一起用的时候,会按照优先级进行运算:

"abc".5*3        # 返回abc15,乘法先运算
"abc".5 + 3 # 返回3,"."先运算
"abc".(5+3) # 返回abc8

heredoc

perl中也支持heredoc,所谓heredoc,即表示将后面的内容当作文档。既然是文档,就需要有文档起始符和文档结束符,分别标识文档从哪里起始,到哪里结束。

一般来说,所有支持heredoc的语言,文档起始符和文档结束符都必须相同(一般使用EOF或eof作为起始符和结束符),且结束符必须单独占行且顶格书写。

perl中支持的heredoc格式如下,以print为例:

print <<EOF;
line1
line2
line3
EOF
  • 这里以EOF作为文档起始符和结束符
  • 起始符EOF后面必须加上分号结尾,分号后的所有内容都忽略(即使它后面的不是注释内容)
  • 结束符EOF单独占用一行,且顶格书写
  • 起始符和结束符中间是怎样的数据,输出时就是怎样的数据

perl的heredoc还有自己的特性,可以为起始符加上单引号和双引号以及其它符号。加单双引号后的效果和一般单引号、双引号的能力是一样的:

  • 单引号是强引用
  • 双引号是弱引用
  • 不加引号等价于加双引号
  • 加反引号`,则将字符串放进shell环境执行

加单双引号:

$name="malongshuai";

print <<'EOF';
haha
\$name # 反斜线转义功能失效 $name # 变量无法替换
EOF print <<"EOF";
haha
\$name # 反斜线成功转义 $name # 变量成功替换
EOF

加反引号:

print <<`EOF`;
date +"%F %T"
EOF

可以将heredoc直接赋值给变量:

$msg = <<EOF;
HELLO
WORLD
EOF print $msg; # $msg不要加换行符,因为$msg是一个heredoc,自带换行符

Perl的数值和字符串的更多相关文章

  1. SQL零星技术点:SQL中转换money类型数值转换为字符串问题

    --SQL中转换money类型数值转换为字符串问题,直接转换就转为两位了,所以需要做一下处理.具体请看下述sql实例. 1 create table #test(price money) insert ...

  2. 04_Python的数据类型1数值和字符串_Python编程之路

    上一节我们通过一个helloworld程序学习python的一些简单操作,还有输入与输出 这节我们来讲Python的数据类型与变量的操作 Python的交互器 在讲这个之前,我要先讲一下python的 ...

  3. JS写法 数值与字符串的相互转换 取字符中的一部分显示 正则表达规则

    http://www.imooc.com/article/15885 正则表达规则 <script type="text/javascript"> </scrip ...

  4. [C++]数值与字符串转换问题

    #include <stdio.h>//sprintf #include <stdlib.h>//atof,atol,strtod,strtol using namespace ...

  5. 剑指offer——python【第53题】表示数值的字符串

    题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...

  6. Shell 数值、字符串比较

    Shell脚本中,数值与字符串比较是不同的,因此要注意(注意[]括号内参数和括号之间有一个空格). 一.数值比较 -eq 等于,如: if [ $a -eq $b ] -ne    不等于,如: if ...

  7. 【Java】 剑指offer(20) 表示数值的字符串

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如, ...

  8. 《剑指offer》第二十题(表示数值的字符串)

    // 面试题20:表示数值的字符串 // 题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如, // 字符串“+100”.“5e2”.“-123”.“3.1416”及“-1E-16 ...

  9. Python的数据类型1数值和字符串

    Python的交互器 在讲这个之前,我要先讲一下python的交互器,之后讲解代码(除了做简单项目)都在交互器上进行,这样可能比较直接一些,有利于刚接触python的人理解代码 python在命令行自 ...

随机推荐

  1. Java实现zip压缩文件的解压

    需求描述: 前段时间写了一篇博客<Java实现对文本文件MD5加密并ftp传送到远程主机目录>,实现了一部分的业务需求.然而有些业务可能不止传送一个文件,有时候客户需要传多个文件,原有系统 ...

  2. 用js实现贪吃蛇

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 自动的输入号码的辅助软件在ie浏览器下的尝试

    在ie下面的自动输入号码的软件,我已经折腾了好久.由于ie环境非常复杂:网页延迟这个时间一直不能准确的得到,这个时间主要包括:网络的与服务器的交换速度,网页自身的加载速度,网页的js渲染的效果的影响. ...

  4. 架构(三)MongoDB安装配置以及集群搭建

    一 安装 1.1 下载MongoDB 我个人不太喜欢用wget url, 之前出现过wget下载的包有问题的情况 https://fastdl.mongodb.org/linux/mongodb-li ...

  5. 感悟优化——Netty对JDK缓冲区的内存池零拷贝改造

    NIO中缓冲区是数据传输的基础,JDK通过ByteBuffer实现,Netty框架中并未采用JDK原生的ByteBuffer,而是构造了ByteBuf. ByteBuf对ByteBuffer做了大量的 ...

  6. 初探系列 — Pharbers用于单点登录的权限架构

    一. 前言 就职公司 法伯科技是一家以数据科技为驱动, 专注于医药健康领域的循证咨询公司. 以数据科学家身份, 赋能医药行业. 让每位客户都能享受数据带来的价值, 洞察业务, 不止于数据, 让决策更精 ...

  7. C#通过COM组件操作IE浏览器(一):打开浏览器跳转到指定网站

    简介Internet Explorer对象模型 1.属性 属性 类型 描述 Application Object 返回对Internet Explorer对象的引用. Busy Boolean 返回一 ...

  8. Android JNI 学习(六):Object Operations Api

    一.AllocObject jobjectAllocObject(JNIEnv *env, jclass clazz); 分配新 Java 对象而不调用该对象的任何构造函数.返回该对象的引用. cla ...

  9. PHP删除当前目录及其目录下的所有文件

    使用PHP遍历一个目录下的所有目录及文件,并删除该目录及其目录下的所有子目录和文件,本次代码通过递归的方式来实现. 用到的函数: scandir($path) 遍历一个目录下所有文件并返回数组. un ...

  10. Tomcat 启动时项目报错 org.springframework.beans.factory.BeanCreationException

    事情是这样的,最近我们公司需要将开发环境和测试环境分开,所以就需要把所有的项目部署一套新的开发环境. 我们都是通过 Jenkins 进行部署的,先说一下两个环境的配置: 测试环境配置(旧):jdk1. ...