《Perl语言入门》章后练习题1-4章

《Perl语言入门》章后练习题1-4章

声明:

由于在看《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
答:“ CTRL+D表明end-of-file ”的意思是在linux的terminal窗口,当你想把输入的字符串输入完之后,敲击键盘上的< CTRL+D >,会在下文的输出结果图片中进行注释
代码如下:
#!/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;
}

运行结果:

转载请说明出处内容投诉
CSS教程网 » 《Perl语言入门》章后练习题1-4章

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买