声明:
由于在看《perl语言入门》这本翻译过来的书时,发现章节练习题并没有答案,而本人又懒于寻找原版的英文书籍,故自己根据对相关章节的学习和理解进行了章节练习题答案的整理。
下面所有的答案都是本人编写,并未参考互联网上的答案,且所有的代码都经过编译和验证,但难免仍有疏漏之处,因此如果博友有发现错误之处,欢迎在评论区进行交流!!
注:编写不易,转载或者引用请注明出处!!!引用该书中的题目部分已在文中标明了引用。
第一章
1.ex1_1
题目:输入“Hello,world”这个程序,让它运行起来。(你可以任意命名,但像 ex1_1这样的名字就显得好些,它表示第一章第一个练习
答:
#!/usr/bin/perl
##perl的上述路径也可能是(#!/usr/local/bin/perl),自行查找对应的路径,用“which perl”命令
print "Hello,World\n";
#!/usr/bin/perl
$s = "Hello,World\n";
print $s;
运行结果:上述两个代码运行结果保持一致
2.ex1_2
题目:在命令行输入 perldoc –u –f atan2 这个命令,注意它的输出。如果命令无效,询问你的管理员或者从文档(这个版本的 Perl 文档)中查看调用 perldoc 或其等价的方法。(你需要做这些来完成下一个练习)
答:perldoc -u -f atan2 是一个命令行指令,用于在Perl中获取关于atan2函数的文档信息,这个命令返回的信息通常包括函数的描述、用法、参数说明等,帮助用户理解和使用该函数。如下图,是该命令的返回结果,该结果是直接显示在terminal窗口,需要输入:q命令才可以退出。
运行结果:
3.ex1_3
运行第二个例子(前一节中),观察它的输出。(提示:注意正确输入这些标点符号)。注意到和第二题输出的不同地方了吗?第二个例子的代码如下:
#!/usr/bin/perl
@lines=`perldoc -u -f atan2`;
foreach (@lines){
s/\w<([^>]+)>/\U$1/g;
print;
};
``命令是获取perldoc的运行结果,@定义了一个数组。
foreach是将数组中的数据按行一行一行的取出来;
接下来的是一个利用正则表达式进行的匹配和替换,作用是将x<>尖括号中的内容取出来并全部替换成大写(涉及到用正则表达式进行捕获的知识),运行后的结果如下图。与上图对比可发现不同点。
运行结果:
第二章
1.ex2_1
写一个程序,计算半径为12.5的圆的周长。圆周长等于2(约为3.141592654)乘以半径。答案为78.5。
答:用两种方式实现输出结果为1位小数的效果
#!/usr/bin/perl
$radius=12.5;
$pi1=3.14;
$pi2=3.141592654;
$perimeter1=2*$pi1*$radius;
$perimeter2=sprintf("%.1f",2*$pi2*$radius);
print"The perimeter of a circle with a radius of $radius is $perimeter1.\n";
print"The perimeter of a circle with a radius of $radius is $perimeter2.\n";
运行结果:
2.ex2_2
修改上述程序,用户可以在程序运行时输入半径。如果,用户输入 12.5,则应得到和上题一样的结果
答:注:如果字符串结尾有换行符,chomp 可以去掉它。
#!/usr/bin/perl
chomp($radius=<STDIN>);
$pi=3.14;
$perimeter=2*$pi*$radius;
print"The perimeter of a circle with a radius of $radius is $perimeter.\n";
运行结果:
3.ex2_3
修改上述程序,当用户输入小于 0 的数字时,程序输出的周长为 0,而非负数.
#!/usr/bin/perl
chomp($radius=<STDIN>);
$pi=3.14;
$perimeter=2*$pi*$radius;
if($radius < 0){
print"The perimeter of a circle with a radius of $radius is 0.\n";
}else{
print"The perimeter of a circle with a radius of $radius is $perimeter.\n";
}
4.ex2_4
写一个程序,用户能输入 2 个数字(不在同一行)。输出为这两个数的积.
#!/usr/bin/perl
chomp($a = <STDIN>);
chomp($b = <STDIN>);
$product=$a * $b;
print"The product of $a and $b is $product.\n";
5.ex2_5
写一个程序,用户能输入 1 个字符串和一个数字(n)(不在同一行)。输出为,n 行这个字符串,1 次 1 行(提示,使用 “x” 操作符)。例如,如果用户输入的是 “fred” 和 “3”,则输出为:3 行,每一行均为 fred。如果输入为 “fred” 和“299792”,则输出为 299792 行,每一行均为 fred。
答:
#!/usr/bin/perl
$str=<STDIN>;
chomp($num = <STDIN>);
$result= $str x $num;
print"The result is:\n";
print $result;
第三章
1.ex3_1
写一个程序,将一些字符串(不同的行)读入一个列表中,逆向输出它。如果是从键盘输入的,那在 Unix 系统中应当使用 CTRL+D 表明 end-of-file ,在 Windows 系统中使用 CTRL+Z
#!/usr/bin/perl
chomp(@array=<STDIN>);
@back=reverse @array;
print "The original list is :@array\n";
print "The reverse list is :@back\n";
2.ex3_2
写一个程序,读入一串数字(一个数字一行),将和这些数字对应的人名(下面列出的)输出来。(将下面的人 名列表写入代码中)。例如,当输入为 1 , 2 , 4 和 2 ,则输出的为 fred , betty , dino, 和 betty :fred betty barney dino Wilma pebbles bamm-bamm
#!/usr/bin/perl
chomp(@nums=<STDIN>);
@names=qw(fred betty barney dino Wilma pebbles bamm-bamm);
foreach $num(@nums){
print $names[$num-1],"\n";
}
#!/usr/bin/perl
chomp(@nums=<STDIN>);
@names=qw(fred betty barney dino Wilma pebbles bamm-bamm);
@new_names=();
$i=0;
foreach $num(@nums){
$new_names[$i]=$names[$num];
$i+=1;
}
print "@new_names\n";
运行结果:
3.ex3_3
写一个程序,将一些字符串(在不同的行中)读入一个列表中。然后按 ASCII 顺序将它们输出来。也就是说,当输入的字符串为 fred , barney, wilma , betty ,则输出为 barney betty fred wilma 。分别在一行或不同的行将之输出。
#!/usr/bin/perl
chomp(@array=<STDIN>);
@array=sort @array;
print "@array\n";
运行结果:
#!/usr/bin/perl
chomp(@array=<STDIN>);
@array=sort @array;
foreach $temp(@array){
$temp.="\n";
}
print @array;
运行结果:
第四章
1.ex4_1
写一个名为 &total 的子程序,返回一列数字的和。提示:子程序不应当有任何的 I/O 操作;它处理调用的参数,返 回处理后的值给调用者。结合下面的程序来练习,它检测此子程序是否正常工作。第一组数组之和为 25。my @fred = qw{ 1 3 5 7 9 }; my $fred_total = &total(@fred); print "The total of \@fred is $fred_total.\n"; print "Enter some numbers on separate lines: "; my $user_total = &total(<STDIN>); print "The total of those numbers is $user_total.\n";
答:
需要注意的是输入操作应当在主程序中,不要在子程序中进行定义!!!
其中一个可行的total子程序如下:(你也可以发挥自己的想象力来编写,该答案只作为一个参考)
#!/usr/bin/perl -w
###These codes are for verification purposes###
my @fred = qw{ 1 3 5 7 9 };
my $fred_total = &total(@fred);
print "The total of \@fred is $fred_total.\n";
print "Enter some numbers on separate lines: ";
my $user_total = &total(<STDIN>);
print "The total of those numbers is $user_total.\n";
###subroutine###
sub total{
my $sum=0;
foreach(@_){
$sum+=$_;
}
$sum;
}
运行结果:
2.ex4_2
利用上题的子程序,写一个程序计算从 1 到 1000 的数字的和
#!/usr/bin/perl -w
my @fred = (1 .. 1000);
my $fred_total = &total(@fred);
print "The sum of 1 to 1000 is $fred_total.\n";
###subroutine###
sub total{
my $sum=0;
foreach(@_){
$sum+=$_;
}
$sum;
}
运行结果:
3.ex4_3
额外的练习:写一个子程序,名为 &above_average ,将一列数字作为其参数,返回所有大于平均值的数字(提示:另外写一个子程序来计算平均值,总和除以数字的个数)。利用下面的程序进行测试:my @fred = &above_average(1..10); print "\@fred is @fred\n"; print "(Should be 6 7 8 9 10)\n"; my @barney = &above_average(100, 1..10); print "\@barney is @barney\n"; print "(Should be just 100)\n";
答:
#!/usr/bin/perl -w
my @fred = &above_average(1..10);
print "\@fred is @fred\n";
print "(Should be 6 7 8 9 10)\n";
my @barney = &above_average(100, 1..10);
print "\@barney is @barney\n";
print "(Should be just 100)\n";
sub average{
my $sum=0;
my $num=@_;
foreach(@_){
$sum+=$_;
}
$sum/$num;
}
sub above_average{
my $average=&average(@_);
my $count=0;
my @result=();
foreach(@_){
if($_>$average){
$result[$count]=$_;
$count+=1;
}
}
@result;
}
运行结果: