Perl Learning log

pop, push, shift, unshift

poppush删除/新增元素到数组末尾,返回数组最后一个元素。
shiftunshift删除/新增数组第一个元素,返回第一个元素。
splice删除并返回给定位置的元素。替换/添加新列表

foreach 控制结构

逐项遍历列表中的值,依次提取使用。
如果省略控制变量,perl会用$_

foreach  (1..10){
    print "I can count to $_!\n";
}
I can count to 1!
...
I can count to 10!

reverse 操作符

读取列表的值,并按相反次序返回新的列表。

sort操作符

排序

each

每次对数组调用each, 会返回数组中下一个元素对应的两个值——数组索引与元素值,类似返回键值对。

@rock = (qw/ bedrock slate lava /);
while(($index, $value) = each @rock){
    print "$index:$value\n"
}
0:bedrock
1:slate
2:lava

子程序

有些情况,调用子程序会在其名字前加上&号。子程序名归属于独立的名字空间(namespace),因此同名子程序和标量不会搞混。

定义子程序

sub开头+子程序名+{程序主体}
调用:名称前+&
在perl中,所有子程序都有一个返回值,并且是执行过程中最后一次运算的结果,无论是什么都会被当作返回值。最后语句若为print则会返回1

sub sum_of_fred_and_barney {
    print "Hey, you called the sum_of_fred_and_barney subroutine!\n";
    $fred + $barney;
}

$fred = 3;
$barney = 4;
$wailma = &sum_of_fred_and_barney;
print "\$wailma is $wailma.\n";

$betty = 3 * &sum_of_fred_and_barney;
print "\$betty is $betty.\n"

Hey, you called the sum_of_fred_and_barney subroutine!
$wailma is 7.
Hey, you called the sum_of_fred_and_barney subroutine!
$betty is 21.
传入参数

在子程序调用的后面加上括在括号内的列表表达式就行了。
perl会自动将参数列表化为特殊的数组变量@_ ,子程序的第一个参数储存于 [ 0 ] , 第 二 个 参 数 储 存 于 _[0],第二个参数储存于 [0]_[1],依此类推。

sub max {
    if($_[0] > $_[1]){
        $_[0];
    } else {
        $_[1];
    };
};
子程序的私有变量

默认情况下perl里所有变量都是全局变量,在程序里任何地方都可以访问他们。但你随时可以借助my操作符来创建私有变量,称之为词法变量(lexical variable):

sub max {
    my($m,$n);
    ($m,$n) = @_;
    #只有代码简单到只有一行时,才可以省略;
    if($m > $n){$m} else {$n}
};

my操作符可以应用到括号内的变量列表,所以一般会将这个子程序中的前两行语句合并起来:
my($m.$n) = @_;
改进&max,使它能够接受任意数目的参数:

sub max {
    my($max_so_far) = shift @_;
    foreach (@_){
        if($_ > $max_so_far){
            $max_so_far = $_;
        };
    };
    $max_so_far;
};

my声明的词法变量可用在任何语句内,并不限于子程序的语句块。my没加()时,只能用来声明最近的单个词法变量。在日常的Perl编程中,最好对每个新变量都使用my声明。

return

立即返回某个值,而不再执行子程序的其余部分。

省略&号

一般参数列表放入括号中。就一定是函数调用,就可以省略&号。
my @cards = shuffle(@deck_of_cards);

持久化私有变量

state声明可以将当前子程序变量持久私有化。

use v5.10;

running_sum(5,6);
running_sum(1..3);
running_sum(4);

sub running_sum {
    state $sum = 0;
    state @numbers;

    foreach my $number (@_){
        push @numbers, $number;
        $sum += $number;
    }

    say "The sum of (@numbers) is $sum";
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值