- 论坛徽章:
- 30
|
- 数组函数
- 我们将使用数组@stack来演示:
- my @stack = ("Fred", "Eileen", "Denise", "Charlie");
- print @stack; # "FredEileenDeniseCharlie"
- pop提取和返回数组的最后一个元素。这可以被认为是堆栈的顶部:
- print pop @stack; # "Charlie"
- print @stack; # "FredEileenDenise"
- push附加额外的元素到数组的末尾:
- push @stack, "Bob", "Alice";
- print @stack; # "FredEileenDeniseBobAlice"
- shift提取并返回数组的第一个元素:
- print shift @stack; # "Fred"
- print @stack; # "EileenDeniseBobAlice"
- unshift在数组的开始插入新元素:
- unshift @stack, "Hank", "Grace";
- print @stack; # "HankGraceEileenDeniseBobAlice"
- pop,push,shift和unshift都特殊情况的拼接。splice移除并返回一个数组切片,取而代之的是一个不同的数组切片:
- print splice(@stack, 1, 4, "<<<", ">>>"); # "GraceEileenDeniseBob"
- print @stack; # "Hank<<<>>>Alice"
- 从旧的数组创建新的数组
- Perl提供了以下功能,作用于数组创建其他数组。
- join连接函数连接许多字符串为一个:
- my @elements = ("Antimony", "Arsenic", "Aluminum", "Selenium");
- print @elements; # "AntimonyArsenicAluminumSelenium"
- print "@elements"; # "Antimony Arsenic Aluminum Selenium"
- print join(", ", @elements); # "Antimony, Arsenic, Aluminum, Selenium"
- 在列表中上下文中,reverse函数以相反的顺序返回一个列表。在标量上下文,反向连接整个列表放在一起,然后反转它作为一个单独的词。
- print reverse("Hello", "World"); # "WorldHello"
- print reverse("HelloWorld"); # "HelloWorld"
- print scalar reverse("HelloWorld"); # "dlroWolleH"
- print scalar reverse("Hello", "World"); # "dlroWolleH"
- map函数将一个数组作为输入,并在这个数组对每一个标量$ _实行操作。然后构造一个新的数组。在一个表达式括号内提供操作执行的形式:
- my @capitals = ("Baton Rouge", "Indianapolis", "Columbus", "Montgomery", "Helena", "Denver", "Boise");
- print join ", ", map { uc $_ } @capitals;
- # "BATON ROUGE, INDIANAPOLIS, COLUMBUS, MONTGOMERY, HELENA, DENVER, BOISE"
- grep函数将一个数组作为输入,并返回一个过滤数组作为输出。其语法类似于map。这一次,第二个参数是评估每个标量$ _在输入数组。如果一个布尔真值返回,标量放入输出数组。
- print join ", ", grep { length $_ == 6 } @capitals;
- # "Helena, Denver"
- 显然,结果数组的长度是成功匹配的数量,这意味着您可以使用grep来快速检查是否包含一个元素的数组:
- print scalar grep { $_ eq "Columbus" } @capitals; # "1"
- grep and map may be combined to form list comprehensions, an exceptionally powerful feature conspicuously absent from many other programming languages.
- grep和map可以组合成列表理解, 其他一些编程语言缺少一个这样的特性。
- 默认情况下,sort函数返回按词法(字母)的顺序的输入数组,:
- my @elevations = (19, 1, 2, 100, 3, 98, 100, 1056);
- print join ", ", sort @elevations;
- # "1, 100, 100, 1056, 19, 2, 3, 98"
- 然而,类似于grep和map,你可以提供你自己的一些代码。排序总是比较两个元素。你收到$a和$b作为输入, 如果$a是<$ b,应该返回-1,$a=$b应该返回0,$a>$b, 应该返回1。
- 如果两个字符串比较就用cmp:
- print join ", ", sort { $a cmp $b } @elevations;
- # "1, 100, 100, 1056, 19, 2, 3, 98"
- 对数字就用 < = >:
- print join ", ", sort { $a <=> $b } @elevations;
- # "1, 2, 3, 19, 98, 100, 100, 1056"
- $a and $b are always scalars, but they can be references to quite complex objects which are difficult to compare. If you need more space for the comparison, you can create a separate subroutine and provide its name instead:
- $ a和$b总是标量,他们可以采用引用, 但相当复杂,很难比较。如果你需要更多的空间来比较,您可以创建一个单独的子程序,并提供它的名字来代替:
- sub comparator {
- # return -1, 0 or 1
- }
- print join ", ", sort comparator @elevations;
- 对于map和grep函数,你不能这样做,。
- Notice how the subroutine and block are never explicitly provided with $a and $b. Like $_, $a and $b are, in fact, global variables which are populated with a pair of values to be compared each time.
- 注意,子程序和块是从来没有明确地提供$a和$b。就像变量$ _, $ a和$b事实上是全局变量。
复制代码 |
|