你已经了解 Perl 15 分钟了?现在忘记参考。
基本上,传递给子例程的所有内容都是一个数组。实际上,它存储在一个名为@_
.
# /usr/bin/env perl
use strict; #ALWAYS USE!
use warnings; #ALWAYS USE!
my @array = qw(member1 member2 member3 member4);
foo(@array, 'scalar', 'scalar', 'scalar');
sub foo {
print "My input is " . join (":", @_) . "\n";
这将打印:
my input is member1:member2:member3:member4:scalar:scalar:scalar
无法分辨哪些条目来自数组,哪些来自标量。就您的子例程而言,它们都是数组的成员@_
。
顺便说一下,Perl 带有一个名为perldoc
. 当有人说要查看perlref
时,您可以在perldoc perlref
命令行输入并查看文档。您还可以访问该站点,该站点也将包含在命令http://perldoc.perl.org
中找到的相同信息。perldoc
现在关于参考......
Perl 数组的数据元素或哈希值只能包含一个值。它可以是字符串,可以是实数,也可以是整数,还可以是对另一个 Perl 数据结构的引用。这就是所有乐趣和金钱的所在。
例如,foo
上面的相同子例程可能会获取以下信息:
foo(\@array, 'scalar', 'scalar', 'scalar'); #Note the backslash!
在这种情况下,您不会传入@array
into的值foo
。相反,对数组的引用作为 的第一个数据元素传递@_
。如果您尝试 print out $_[0]
,您会得到类似ARRAY:6E43832
数据元素是一个数组以及它在内存中的位置的信息。
现在,您可以使用该ref
函数来查看一条数据是否为引用以及它是引用的类型:
sub foo {
foreach my $item (@_) {
if (ref $item eq 'ARRAY') {
print "This element is a reference to an array\n";
}
elsif (ref $item eq 'HASH') {
print "This element is a reference to a hash\n";
}
elsif (ref $item) { #Mysterious Moe Reference
print "This element is a reference to a " . lc (ref $item) . "\n";
}
else {
print "This element is a scalar and it's value is '$item'\n";
}
}
}
当然,您对数组的引用可能是一个包含对包含对数组的引用等的哈希的引用的数组。Perl 附带一个名为Data::Dumper
(您可以使用perldoc
它来查看有关它的信息)的模块,它将打印出整个数据结构。
这就是面向对象 Perl 的工作方式,因此在一段 Perl 数据中嵌入对其他 Perl 数据结构的引用非常普遍。
现在,只需熟悉基本的 Perl 及其工作原理。然后,开始查看Perldoc中有关Perl 引用的各种教程。