Perl有三种内置变量类型:
标量代表一个单一的值如下:
my $animal = "camel"; my $answer = 42;
在这里my是一个已在同一节中解释的关键字。
一个标值可以是字符串,整数或浮点数,Perl会自动转换为它们需要的,但没有必要预先声明的变量类型。标值可以用各种方式:
print $animal; print "The animal is $animal\n"; print "The square of $answer is ", $answer * $answer, "\n";
看上去像标点符号或线路噪声的名称是“神奇”的标量。这些特殊的变量被用于各种目的,他们将讨论在特殊的变量部分。只有一个,你要知道现在大约是$_这是“默认变量”。它作为Perl函数的默认参数,它设置一些循环结构隐.
print; # prints contents of $_ by default
数组表示的值的列表:
my @animals = ("camel", "llama", "owl"); my @numbers = (23, 42, 69); my @mixed = ("camel", 42, 1.23);
数组是从零开始的索引,但你可以改变这个设置,改变默认变量$[$ ARRAY_BASE。这里是你如何获得元素在数组:
print $animals[0]; # prints "camel" print $animals[1]; # prints "llama"
特殊变量$#数组告诉你数组的最后一个元素的索引:
print $mixed[$#mixed]; # last element, prints 1.23
你可能会使用$#array+1,告诉你一个数组中有多少个项目。不要打扰。由于它发生时,使用@array,而Perl期望找到一个标量值(“标量上下文”)会给你在数组中的元素数量:
if (@animals < 5) { ... } # Here @animals will return 3
我们正在数组的从$起始,因为我们得到的只是一个单一的值数组 - 你要求一个标量元素,你会得到一个标量.
若要获取一个数组的多个值:
@animals[0,1]; # gives ("camel", "llama"); @animals[0..2]; # gives ("camel", "llama", "owl"); @animals[1..$#animals]; # gives all except the first element
这被称为“数组切片”。你可以做各种有用的东西,列表如下:
my @sorted = sort @animals; my @backwards = reverse @numbers; # Here sort and reverse are Perl's built-in functions
有几个特殊阵列,如@ ARGV中(脚本的命令行参数)和@_(参数)传递给子程序。这些都记录在下一节“特殊变量”.
哈希代表一组键/值对。 事实上哈希数组类型的哈希索引可以是一个数字或字符串的异常。他们的前缀%符号如下:
my %fruit_color = ("apple", "red", "banana", "yellow");
您可以使用空格和=>运算符,奠定了更很好的:
my %fruit_color = ( apple => "red", banana => "yellow", );
为了得到一个哈希的元素:
$fruit_color{"apple"}; # gives "red"
键的键和值的列表,你可以get()和values()内置函数.
my @fruits = keys %fruit_colors; my @colors = values %fruit_colors;
哈希值有没有什么特别的内部秩序,但你可以通过它们进行排序键和循环。就像特殊的标量和数组,也有特殊的哈希。这些是%ENV其中包含环境变量.
可以构建更复杂的数据类型,使用引用,它允许你建立名单,并在列表和哈希散列。引用是一个标值,可以参考任何其他的Perl数据类型。因此,存储数组或哈希元素的值作为参考,你可以很容易地创建列表和哈希内的列表和哈希.
下面的例子显示一个哈希结构的2级哈希使用匿名散列引用.
my $variables = { scalar => { description => "single item", sigil => '$', }, array => { description => "ordered list of items - www.gitbook.net", sigil => '@', }, hash => { description => "key/value pairs", sigil => '%', }, };
下面一行将打印 $
print "$variables->{'scalar'}->{'sigil'}\n" ;
Perl根据不同语境相同的变量。例如
my @animals = ("camel", "llama", "owl");
在这里,@animals是一个数组,但它是在标量上下文中使用时,然后返回元素接触的数量.
if (@animals < 5) { ... } # Here @animals will return 3
另一个例子:
my $number = 30;
这里$number是标量和它包含的数量,但是当它被称为字符串然后它成为数为0,字符串代替,:
$result = "This is " + "$number"; print "$result";
这里将输出30
在Perl中,我们使用反斜杠(\)字符来转义任何类型的字符,可能会干扰我们的代码。下面是例子
$result = "This is " . "\"number\""; print "$result";
这里输出将是这是“number”
变量名是大小写敏感的$foo, $FOO和$fOo都是单独.
整个上一节中所有的例子中,使用下面的语法:
my $var = "value";
其实我是不需要的,你可以只使用:
$var = "value";
然而,上述用法将创建全局变量在整个程序中,这是不好的编程习惯。但my创建词法作用域的变量。变量的作用域在定义它们的块(即一串由大括号包围的语句)。有一个看看下面的例子:
my $a = "foo"; if ($some_condition) { my $b = "bar"; print $a; # prints "foo" print $b; # prints "bar" by www.gitbook.net # } print $a; # prints "foo" print $b; # prints nothing; $b has fallen out of scope
结合使用my严格变量;在你的Perl脚本的顶部,意味着解释将拿起一些常见的编程错误。例如,在上面的例子,最后打印$b的会导致一个编译时错误和防止运行程序。强烈建议使用严格。以下是使用:
use strict; my $a = "foo"; if ($some_condition) { my $b = "bar"; print $a; # prints "foo" print $b; # prints "bar" } print $a; # prints "foo " by www.gitbook.net print $b; # prints nothing; $b has fallen out of scope
我的运算符宣布列出的变量被词法不外乎以下但不限于:
Enclosing blocks,
Conditional (if/unless/elsif/else)
Loop (for/foreach/while/until/continue)
Subroutine
eval or do/require/use'd file
如果列出了多个值,列表必须放在括号中。列出的所有元素都必须是合法的左值。当前必须与当地的本地化,而不是像$/作用域 - 魔法的内置插件.
my $foo; # declare $foo lexically local my (@wid, %get); # declare list of variables local my $foo = "flurp"; # declare $foo lexical, and init it my @oof = @bar; # declare @oof lexical, and init it my $x : Foo = $y; # similar, with an attribute applied
控制结构的词法作用域范围内精确地划定控制块由括号控制表达式是该范围内的一部分. 因此,在循环$line范围延伸整个循环结构(包括继续条款)的其余部分从它的声明,但不超过.
while (my $line = <>) { $line = lc $line; }continue { print $line; }
同样,在有条件$answer的范围延伸,有条件的其余部分通过其声明,包括任何的elseif语句及其他子句,但不超过
if ((my $answer = <STDIN>) =~ /^yes$/i) { user_agrees(); } elsif ($answer =~ /^no$/i) { user_disagrees(); } else { chomp $answer; die "'$answer' is neither 'yes' nor 'no'"; }
我们鼓励使用词法作用域的变量。使用以下行,在你的程序文件的顶部,以避免任何错误。这会提醒你的变量范围使用local 或my 关键字.
use strict 'vars';
本地修改其上市的变量是“local”封闭块,eval,或做文件 - 从该区块内调用的任何子程序。一个地方,只是给全局意义包变量的临时值。它不创建一个局部变量。这被称为动态范围.
词法作用域是my,这更像C语言的自动声明工作.
local $foo; # make $foo dynamically local local (@wid, %get); # make list of variables local local $foo = "flurp"; # make $foo dynamic, and init it local @oof = @bar; # make @oof dynamic, and init it
因为当地是一个运行时间的运算符,它通过一个循环,每次被执行。因此,它是更有效的本地化外循环的变量。
如果你定位一个特殊的变量,你给它一个新的价值,但它的魔法不会消失。这意味着,所有有关这种神奇的副作用仍然使用本地化值。此功能允许像这样的代码工作:
# Read the whole contents of FILE in $slurp { local $/ = undef; $slurp = <FILE> ; }