标量存储单一的数据项,表包含多个数据项。标量是实际的数据类型,perl没有表这样的数据类型。标量和表的差异是一种工作环境而非数据类型。Perl知道你当前是工作在标量环境还是表上下文。例如,如果代码在表上下文中使用了函数或运算符,就可能将它的返回值赋给表;如果函数是在标量环境中使用的,Perl就知道你需要标量数据项。表与标量不同的是,在perl中并不能得到实际的表数据类型。也就输说,没有什么存储类型的名字叫表。在编程代码让它一次同时处理多个数据项时,就是在使用表,使用表语法。例如,给标量分配数据可能就像这样:$x=1; 而给表赋值可能像这样:($x,$y)=(1,2);


表并不代表像标量那样的存储格式。perl只有3种不同的数据格式:标量、数组、哈希表。标量:最简单的变量,存储单一的数据项:数字、字符串。在标量名的前面使用$号。在perl中对每个数据类型必须使用不同的前缀:标量用$、数组用@、哈希表用%、甚至在一些并非数据格式的项前面也使用了前缀:子程序的名字使用&,而通配量使用*。


perl中3种不需要前缀的项命名:文件句柄、格式名称、目录句柄。标量的两种类型是数字和字符串。给标量赋值时使用=预算符,如:$scalarl=5;$scal=”hello there!“;在perl的运算符和函数里也可以使用标量。所用的运算符和函数通常取决于标量数据是数字还是字符串。标量代表了存储数据项的实际内存位置;字符串或数字这些变量是perl存储的数据的最基本单元。表:数据元素的列表,那些元素并不一定是标量数值,它们本身可以是数组或哈希表,甚至其他表。表是将数据元素联系起来的结构,

可以通过把这些项放在括号中并用逗号分隔开的方法指明.例如:print("H","e","l","l","o");

perl中的函数分为两组:一组期望标量作为变量,另一组则希望变量为表。perl是基于程序工作环境做出决定的,两个最重要的工作环境就是标量环境和表上下文。如果perl预期使用表,它就会将数据看作是表;如果预期使用标量,它就会将数据看作是标量。在标量环境中,表可以变成标量,而在表上下文中,标量经常变成元素的表。标量实际就是内存里的数据空间的名字,数据就存储在该数据空间中,它可能是数字或字符串。使用$x=100;创建的标量是全局变量,这意味着可以在当前脚本的任何地方使用它们,但可以通使用含有my和local关键字的声明将它们局部化。


变量名可以含有字母、数字、下划线。这样的名字必须以$符号开头,以避免它与perl的保留字冲突。变量名区分大小写,$variable和$Variable不同。在开头的$之后,可以使用任何字母或下划线作为第一个字符。


PS:用数字作为$后的第一个字符。但是,如果变量名以数字开头,它必须全部由数字组成。


所有标量名前都要使用$符号做前缀。perl中使用的所有前缀及用处如下:


1.$——标量


2.%——哈希表(关联数组)


3.@——数组


4.&——子程序


5.通配量——如*myval代表myvar的每种类型,如@myvar,%myvar等


perl中无需声明标量在使用它们,第一次使用标量时,如果它并不存在,perl就会创建它。标量除了单独赋值外还可以使用同样的语句创建多重赋值如:$=$y=$z=1;在这个例子中,每个标量都设置了同样的数值:1。


左值通常代表内存里的数据空间,可以使用左值的名称存储数据。所有变量都可以作为左值。perl支持很多数字格式:整型(123)、浮点型(1.23)、科学型(1.23E4)、十六进制(0x123)、八进制(0123)二进制(0班01010)、下划线型(1_234_567)。


下划线型的数字类型,它能够将数字格式化为3个一组以便于辨认。例如:$variable=1_234_567;perl对于所有的数值计算都使用了双精度,同时其内部存储也是双精度。


标量可以容纳perl的未定义数值undef,某些函数返回这个数值,可以通过使用defined函数来检查。如果直接检查undef量,在数字环境中它被解释为数值0,在文字环境中,被解释为空字符串""。也可以通过使用undef函数将变量设置给undef值。perl中很多地方使用undef,在数字不合适的情况下,诸如sysread这样的函数返回值也是undef。未初始化的标量实际上也是未定义的。


通配量可以表示任何一种变量的数据类型。例如:数字常量类型常量。创建常量可以将引用赋值给通配量。例如:建立MAXFILES来保存所能容纳文件的最大数量:*MAXFILES=\100;通过$MAXFILES访问这个常量,像标量一样:*MAXFILES=\100; print"$MAXFILES\N";


Perl用两种方法在标量中存储真值和假值,对应于两种标量环境:数字和字符串环境。PS:在数字环境,”0“代表假,其余任何数值代表真;在字符串环境中,空字符串”“代表假,其余任意数值(包括负值)代表真。用非零值来代表真的事实对创建循环这样的历程特别有用。例如:while循环始终持续,因为<>总是返回一些东西,即使用户键入空行,在这种情况下<>返回换行符。


while(<>)
{print;}

PS:在检查未定义变量时,不是检查假值,当需要时,通过defined函数检查未定义变量。使用pack和unpack函数将数字转换为字符串或二进制以及反过来。将十进制转换为二进制:首先将数字按照网络字节顺序打包(也叫高字节在前顺序),然后逐位将其解包,如下:

$decimal=4;
$binary=unpack("B32",pack("N",$decimal));
print $binary;

pack函数将值打包到字符串;unpack将打包字符串解包为值。perl中八进制数使用打头的o指明,例如:0123:$x=o123;要想转换成八进制或从八进制转换,那就使用sprinf和oct函数。

1.将十进制转换成八进制使用sprintf函数,附带%o转换符:


print sprintf "%lo",16;

2.将八进制转换为十进制使用oct函数

print oct 10

如果不指明想要转换的数值,这个函数默认使用$_。在perl中,十六进制数写的时候开头带有ox,比如ox1AB;$x=ox1AB;要想转换成十六进制或从十六进制转换,需使用sprintf和hex函数。

1.十进制转换成十六进制用sprintf函数,附带%x转换符号:


print sprint "%lx\n",16;

2.将十六进制转换成十进制使用hex函数:

print hex ox1AB;

如果不向hex函数传递想要转换的数值,这个函数默认使用$_.