2021-09-30

Perl练习
第三章习题1

#!usr/bin/perl;
use warnings;
@list=qw (fred betty barney dino wilama pebbles bamn-bamn);
print "Enter some numbers.\n";
chomp(@numbers=<STDIN>);
foreach (@numbers){
        print "$list[ $_ - 1 ]\n";
}
#$list比@list更适合,虽然输出结果一样,标量上下文。这里的foreach(@numbers)默认控制变量是$_

第三章习题2

#!usr/bin/perl;
use warnings;
     chomp ( @strings=<STDIN> );#chomp去掉输入字符串末尾的换行符  
     @strings=<STDIN>;#没有去掉换行符
@sorted = sort @strings;
print "@sorted\n";
#对于@strings=<STDIN>,如果是数组,输出的是每行一个
#对于$ strings=<STDIN>,如果是标量,只能输入一行

第四章
子程序 参数输入

$n=&max(10,15)

1、参数列表会被传入子程序,让子程序随意使用。
2、在传入前,perl首先将这个列表存在某处,自动将参数列表化名为特殊变量@_,该变量在子程序执行期间有效,子程序可以访问这个数组,来判断参数个数和参数值。
3、

$_[0]表示子程序的第一个参数存储的地方,这些变量与$_无关系
例如:$dino[3](数组@dino中的元素之一)
my ($m,$n) = @_;声明m,n为私有变量,作为参数赋给变量
my($num) = @_;列表上下文,num会被设为第一个参数
my $num = @_;标量上下文,num会被设为参数的个数

举个例子,return用法,参数用法

my @names = qw (fred barney betty dino wilma pebbles bamn-bamn /;
my $result = &which_element_is("dino",@names);
sub which_element_is {
  my($what,@array) = @_;#my声明私有变量:一个是$what表示要搜索的值,另一个是@array表示要从中搜索的数组。
  foreach (0..$#array){     #依次取出数组@array 中所有元素的索引
    if ($what eq $array[$_]) {
      return $_;  #一发现 就提前返回当前索引值,不再执行下面部分
      }
    }
    -1;   #表示没找到符合条件的元素
  }

省略子程序的&号
只要将参数列表放进括号,就一定是函数调用

my @cards = shuffle (@deck_of_cards); #子程序shuffle

假如子程序和Perl内置函数同名,&不可省略。内置函数优先级高

如何判断子程序在标量上下文还是列表上下文中被调用,可以用wantarray函数测式,返回真列表,返回假标量。

state Perl该变量属于当前子程序的私有变量,并且在多次调用这个子程序期间保留该变量当前值,以备下次调用。

展示一个例子 计算参数总和

use v5.10;
running_sum(5,6,7);
sub running_sum {
  state $sum = 0;
  state @numbers;

  foreach my $number (@_) {
    push @numbers, $number;
    $sum+= $number;
  }
  say "The sum of (@numbers) is $sum";
  }

第四章习题
3.
下面展示一些 内联代码片

#!usr/bin/perl;
use v5.10;
use warnings;
my @fred = above_average(1..10);
sub total {
        state @numbers;
        state $sum = 0;
        foreach my $number(@_){
                push @numbers,$number;
                $sum += $number;
        }
        print "The @numbers is $sum.\n";
}

sub average {
        if (@_==0){return}
        my $count = @_;
        my $sum = total(@_);
        $sum/$count;
}

sub above_average {
        my $num_average = average(@_);
        my @list;
        foreach my $element(@_){
                if ($element > $num_average) {
                        push @list, $element;
                }
        }
        print @list;
}

结果输出

The 1 2 3 4 5 6 7 8 9 10 is 55.
12345678910%  

第五章
1、
<>把fred文件中的内容,当做输入流,进行处理,默认会在$_进行读取
举个例子:

(base) [user159@lz16]~/wm%  vi per.test0.pl
#!usr/bin/perl;
use warnings;
print reverse(<>);
#保存并退出 fred是一个文件 内容是 fred hello
(base) [user159@lz16]~/wm% perl ./perl.test0.pl fred          
hello
fred

2、

#!usr/bin/perl;
use warnings;
chomp(my @line= <STDIN>);不加chomp 输入时自带换行符,换行符占一个内容。
$rule='1234567890'x 4;
print "$rule\n";
foreach (@line){
        printf "%20s\n",$_;#前面去除了换行符,在设置输出格式时,加上换行符,换行符占第21位
}

3、

#!usr/bin/perl;
use warnings;
print "Enter your format.\n";
my $width=<STDIN>;

print "Enter your line.\n";
chomp (@line=<STDIN>);
my $repeat = ($width+9)/10;
my $format='1234567890'x $repeat;
print "$format\n";
foreach (@line){
        printf "%*s\n",$width,$_;#经测试,这种格式比较好使
}

第六章

#!usr/bin/perl;
use warnings;
my(@words,%count,$word);
chomp(@words=<STDIN>);
foreach $word (@words){
        $count{$word} += 1; #$count{$word}表示值
}
foreach $word (keys %count){
        print "$word was seen $count{$word} times.\n";
}


3、

#!usr/bin/perl;
use warnings;
my $longest = 0;
foreach $key(keys %ENV){   #这里不my声明  是因为没有涉及到变量的改变
        my $key_length = length ($key);
        $longest = $key_length if $key_length > $longest;
}
foreach my $key( sort keys %ENV ){
        printf "%-${longest}s %s\n",$key,$ENV{$key};
}

my声明变量,防止改变原值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值