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声明变量,防止改变原值。