Perl-标量数据2

1. 数字与字符串之间的自动转换

Perl会根据需要自动转换数字和字符串数据,转换的原则取决于操作符的意义

如果操作符(如+)需要的是数字,Perl就把操作数看作数字;
如果操作符(如.)是用于处理字符串的话,Perl就把操作数看作字符串。

  1. Perl 会自动将字符串转换成等效的十进制浮点数进行计算
  2. 字符串中非数字的部分(以及前置的空白符号),会被略过
  3. 完全不含数字的字符串会被转换成0
12*3# 结果为36
“12fred34” *3# 结果为36

0377 # 十进制数字255的八进制写法0377# 会转换成十进制数字377

“Z” . 5 * 7 # 等同于“Z” . 35,得到“Z35”
Perl 的内置警告信息

从Perl 5.6开始,可以通过编译指令启用警告机制

#! /usr/bin/perl
use warnings;

命令行调用程序时给出-w选项表示启用警告机制,其作用域包括引入模块的代码,所以可能会看到有关别人代码的警告信息

$ perl -w my_program

shebang行启用警告选项

#! /usr/bin/perl -w

当启用Perl的内置警告信息后,此时再把"12fred34"当数字用,Perl会发出警告信息

Argument "12fred34" isn't numeric

相较于 -w 的写法,使用warnings编译指令的好处在于作用域仅限于书写该指令的文件内,但前者则是打开了当前程序所引入的所有代码的警告机制

虽然发出来警告,但Perl仍旧会按规则把非数字"12fred34"转换为数字12

如果看不懂警告信息的内容,可以利用diagnostics编译指令。在perldiag文档中列出了每个警告信息的简短描述和详尽解释,这些都是diagnostics报告的核心内容

use diagnostics;

但在加载diagnostics后,程序启动会有点慢,这是由于程序需要预先加载警告和详细说明到内存,以便碰到需要时可以立即输出相关的错误信息

$ perl -Mdiagnostics ./my_program
Argument "12fred34" isn't numeric in addition (+) at ./my_program line 17 (#1)
    (W numeric) The indicated string was fed as an argument to
    an operator that expected a numeric value instead. If you are
    fortunate the message will identify which operator was so unfortunate. 

警告信息中出现的(W numeric),其中W的意思是警告级别属于普通警告,numeric的意思是警告类型属于数字操作一类

2. 非十进制数字的转换

hex('DEADBEEF'); # 十进制数字 3_735_928_559
hex('0xDEADBEEF'); # 十进制数字 3_735_928_559

oct('0377'); # 十进制数字 255
oct('377'); # 十进制数字 255
oct('0xDEADBEEF'); # 是十进制数字 3_735_928_559,因为开头有“0x”
oct('0b1101'); # 是十进制数字 13,因为开头有“0b”
oct("0b$bits"); # 将变量 $bits 中的值当作二进制数字转换为十进制数字

如果直接写数字直接量的话,往往会弄错结果
因为Perl会自动将其转换为字符串,然后再转换为其它进制的数字,而这个数字已经和原来的直接量数字不相等了

hex(10); # 十进制数字10,先转换为字符串“10”,再转换为十进制数字16
hex(0x10); # 十六进制数字10,先转换为字符串“16”,再转换为十进制数字22

3. 标量变量

变量(variable),存储一个或多个值的容器
标量变量,只保存一个值的变量
变量的名字在整个程序中保持不变,但它所持有的值可以在程序运行时不断修改变化

标量变量的名称以美元符号开头,也称为魔符(sigil),然后是变量的Perl标识符:由字母或下划线开头,后跟多个字母、数字或下划线
标识符区分大小写
Perl不限于使用ASCII字符作为变量名,如果启用了utf8编译指令,那可用于表示字母或数字的字符会多得多

Perl通过变量标识前的魔符来区分变量的类型,所以不管变量的名字是什么,都不会和Perl自带的函数或操作符的名字冲突

Perl通过魔符来判断该变量的使用意图,$的确切意思是“取单个东西”/“取标量”

给变量取个好名字

Perl程序里面大部分变量名都习惯使用全小写,只有少数几种情况中才会使用大写字母,而使用全大写($ARGV)变量一般都是表示特殊意义的变量

perlvar文档:查看全大写的特殊变量的用处
perlstyle文档:关于编码风格的经验总结

4. 标量的赋值

Perl的赋值符号是等号

$fred = 17;
$barney = 'hello';
$barney = $fred + 3; # 20
$barney = $barney * 2; # 40

5. 复合赋值操作符

复合赋值操作符就地更新原来的变量值,而传统赋值操作符需要先计算表达式,再把求值后的结果写入变量,复合赋值操作符比传统赋值操作符效率更高

$fred = $fred + 5; # 不使用复合赋值操作符
$fred += 5; # 使用复合赋值操作符

$barney = $barney * 3;
$barney *= 3;

$str = $str . " "$str .= " ";

$fred **= 3; #将$fred里的值自乘3次(取三次方),再存回$fred

6. 用print输出结果

print接受标量值作为参数,然后不经修饰地将它传送到标准输出(standard output),如无另外设置,默认情况下标准输出设备是终端显示屏

print "hello world\n";

print "The answer is ";
print 6 * 7;
print ".\n";

print "The answer is ", 6 * 7,".\n";

Perl 5.10增加了一个改良版print函数,称为say,它每次输出时自动在末尾追加换行符

use v5.10;
say "The answer is ", 6 * 7, '.';

7. 字符串中的标量变量内插

变量内插有时候也叫双引号内插,因为只有在双引号内部才可以这么做,在单引号中不行

$meal = "brontosaurus steak";
$barney ="fred ate a $meal";
$barney = 'fred ate a ' . $meal;

如果标量变量从未被赋值,内插时使用空字符串替换
如果内插时单单是变量本身,不写引号也可以

print "$fred";
print $fred;

用花括号来隔离
如果在变量名后紧跟的字符是左方括号或左花括号,需要用反斜线转义
如果跟的是撇号或连着的两个冒号,也需要用反斜线转义,或者直接使用花括号隔离

$what  = "brontosaurus steak";
$n = 3;
print "fred ate $n $whats.\n";
print "fred ate $n ${what}s.\n";
print "fred ate $n $what" . "s.\n";
print 'fred ate ' .  $n  . ' ' . $what . "s.\n";

8. 用代码点创建字符

$alef = chr(0x05Do);
$alpha = chr(hex('03B1'));
$omega = chr(0x03C9);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值