table {
border-collapse: collapse;
width: 100%;
margin-bottom: 1rem;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
pre {
background-color: #f8f8f8;
padding: 15px;
border-radius: 4px;
overflow-x: auto;
}
1、创建一个包含值 Andrew、Andy 和 Kaufman 的数组,并编写一个程序来打印 Andrew “Andy” Kaufman。
以下是一个简单的 Perl 代码示例来实现该需求:
use strict;
use warnings;
my @array = ('Andrew', 'Andy', 'Kaufman');
print $array[0], ' “', $array[1], '” ', $array[2], "
";
上述代码首先创建了一个包含指定值的数组,然后按要求的格式打印出内容。
2、创建一个哈希表,键为水果名称,值为它们的常见颜色,然后将每个键/值对作为单独的一行打印出来,格式类似于“香蕉是黄色的”。
以下代码可实现这一需求:
use strict;
use warnings;
use diagnostics;
my %color_for = (
bananas => 'yellow',
apples => 'red',
oranges => 'orange',
);
for my $fruit (keys %color_for) {
my $color = $color_for{$fruit};
print "$fruit are $color
";
}
3、在$second、$fourth和$sixth这些变量中,哪些变量的值为真,为什么?如何让$fourth的值为假?
`$second`、`$fourth` 和 `$sixth` 的值都为真。`$second` 是一个空格字符串,非空字符串在布尔判断中为真;`$fourth` 是字符串 `'0.0'`,非空字符串在布尔判断中也为真;`$sixth` 为字符串 `'false'`,同样非空,所以也为真。
要让 `$fourth` 的值为假,可以将其赋值为空字符串、数字 `0`、未定义值等,例如:
```perl
$fourth = '';
或
$fourth = 0;
或
$fourth = undef;
##4、给定一个包含值 (0, 32, 65, 80, 212) 的 @fahrenheit 数组,创建 @celsius 数组,要求将 @fahrenheit 数组中的每个华氏温度值转换为摄氏温度值。
要创建 `@celsius` 数组,需将 `@fahrenheit` 数组中的每个华氏温度值转换为摄氏温度值。转换公式是先减去 32,然后乘以 5/9。以下是实现代码:
```perl
my @fahrenheit = ( 0, 32, 65, 80, 212 );
my @celsius = map { ( $_ - 32 ) * 5 / 9 } @fahrenheit;
5、给定一个包含值 qw(AAA bbb Ccc ddD EEE) 的 @ids 数组,创建 @upper 数组,要求 @upper 数组中的元素是 @ids 数组对应元素的大写形式。
可以使用循环遍历
@ids
数组,将每个元素转换为大写后存入
@upper
数组。示例代码如下:
my @ids = qw(AAA bbb Ccc ddD EEE);
my @upper;
foreach my $id (@ids) {
push @upper, uc($id);
}
6、如何创建一个哈希,键为水果名称,值为它们的正常颜色,并将每个键/值对作为单独的一行打印出来,类似于“bananas are yellow”?
可以使用以下代码实现:
use strict;
use warnings;
use diagnostics;
my %color_for = (
bananas => 'yellow',
apples => 'red',
oranges => 'orange',
);
for my $fruit (keys %color_for) {
my $color = $color_for{$fruit};
print "$fruit are $color
";
}
注:原答案中字符串使用了中文单引号,应改为英文单引号,并且缺少换行符
以保证每行输出一个键值对信息。
7、如何创建@celsius 数组,已知@fahrenheit 数组的值为( 0, 32, 65, 80, 212 )?
要创建
@celsius
数组,可将
@fahrenheit
数组中的华氏温度转换为摄氏温度。转换公式是先减去 32,再乘以 5/9。代码如下:
my @fahrenheit = ( 0, 32, 65, 80, 212 );
my @celsius = map { ( $_ - 32 ) * 5 / 9 } @fahrenheit;
8、如何创建@upper 数组,已知@ids 数组的值为qw(AAA bbb Ccc ddD EEE)?
可以使用以下代码创建
@upper
数组,它包含了
@ids
数组中所有元素的大写形式:
@upper = map { uc } @ids;
9、分析$answer1、$answer2 和 $answer3 的值是如何得到的?
`$answer1`的值为28,是因为乘法运算符优先级高于加法;`$answer2`初始值为6,这是由于减法运算左结合,第三行自增后值变为7;`$answer3`的值为4,是因为在`$answer2`自增前从10中减去它,若自增运算符在`$answer2`前,其值为3。
10、如何让打印的1 到10 的数字在单独的行上显示?
在许多编程语言中,可以使用循环结合换行符来实现。以 Python 为例,代码如下:
for i in range(1, 11):
print(i)
在这个代码中,使用
for
循环遍历 1 到 10 的数字,每次循环使用
print
函数打印一个数字,
print
函数默认会在打印内容后添加换行符,从而使每个数字显示在单独的行上。
11、如何计算数组@numbers(值为qw< 3 9 0 7 8 >)中所有元素的总和?
可以使用以下代码计算总和:
sub sum {
my @numbers = @_;
my $total = 0;
$total += $_ foreach @numbers;
return $total;
}
print sum(qw< 3 9 0 7 8 >);
代码中定义了一个名为
sum
的子程序,它接收一个数组作为参数,通过循环将数组元素累加至变量
$total
,最后返回总和。
12、代码会打印出什么,以及如何让数字打印在不同的行上?
由于未给出代码中的
@stuff
数组具体内容,无法准确得出代码
print @stuff, '';
和
print "@stuff";
分别打印的结果。
若要让数组元素打印在不同行上,可在每次打印元素后添加换行符,如使用循环遍历数组并在每次打印元素时加上换行符:
foreach my $element (@stuff) {
print $element, "
";
}
13、三元运算符代码有什么问题,如何修复?
三元运算符代码的问题
三元运算符的滥用会导致代码难以阅读。例如,当在代码中嵌套多个三元运算符时,虽然代码仍能正常工作,但其可维护性会大大降低。
修复方法
应避免滥用三元运算符。在使用时,确保代码具有良好的可读性,不要编写过于复杂或嵌套的三元运算符代码。
14、如何计算一个数字数组的平均值?
可以定义一个函数来计算。示例代码如下:
sub average {
my @numbers = @_;
my $total = 0;
$total += $_ foreach @numbers;
return $total / @numbers;
}
然后调用该函数并传入数字数组,如:
print average(qw< 1 5 18 3 5>);
即可计算并输出数组的平均值。
15、循环终止条件 $i <= $num_elements 中的逻辑错误是什么,如何修复?
逻辑错误是最终的
$i
值比数组中的最终索引大 1,这被称为
越界错误
,是 C 风格
for
循环常见问题。将循环改为
$i < $num_elements
可修复该问题。
16、如何为哈希表 %stat_for 中的元素分配随机值?
可以使用以下代码为哈希表
%stat_for
中的元素分配随机值:
my $random = 2 + int(rand(6)) + int(rand(6));
redo if $random < 6;
$stat_for{$stat} = $random;
这里
$random
是一个 2 到 14 之间的随机整数,若该值小于 6 则重新生成,最后将其赋值给
%stat_for
哈希表中键为
$stat
的元素。
17、如何编写完整代码为哈希表 %stat_for 中的元素分配随机值并打印结果?
以下是完整代码:
my %stat_for;
foreach my $stat (qw(strength intelligence dexterity)) {
my $random = 2 + int(rand(6)) + int(rand(6));
redo if $random < 6;
$stat_for{$stat} = $random;
}
print <<"END_CHARACTER";
Strength: $stat_for{strength}
Intelligence: $stat_for{intelligence}
Dexterity: $stat_for{dexterity}
END_CHARACTER
这段代码首先初始化了一个空的哈希表
%stat_for
,然后通过循环为
strength
、
intelligence
和
dexterity
三个键分配随机值,随机值范围在 2 到 14 之间,且值小于 6 时会重新生成,最后打印出哈希表中各元素的值。
18、如何计算嵌套哈希结构中销售数据的总和?
可以通过以下步骤计算嵌套哈希结构中销售数据的总和:
使用键访问嵌套哈希结构中的特定数组引用;
对该数组引用进行解引用操作;
使用循环遍历解引用后的数组,将每个元素累加到总和中。
示例代码如下:
my $sales = {
friday => {
jim => [ 1, 1, 5 ],
mary => [ 2 ],
},
};
my $friday = $sales->{friday}{jim};
my $num_sales = @$friday;
my $total = 0;
$total += $_ foreach @$friday;
print "Jim had $num_sales sales, for a total of $total dollars
";
在上述代码中,首先获取了
friday
中
jim
的销售数据数组引用,然后对该数组引用进行解引用操作,使用
foreach
循环遍历数组并将每个元素累加到
$total
中,最终得到销售数据的总和。
19、编写代码创建一个包含 1 到 5 的数组并进行相关操作
以下是使用 Perl 语言创建包含 1 到 5 的数组并进行简单打印操作的示例代码:
my @numbers = (1..5);
foreach my $num (@numbers) {
print $num, "
";
}
这段代码首先创建了一个包含 1 到 5 的数组
@numbers
,然后使用
foreach
循环遍历该数组并打印每个元素。如果需要进行其他操作,可根据具体需求修改代码。
20、根据给定的得分哈希表,提取 Jim 和 Mary 的得分并打印
有两种实现方式。
第一种方式:使用切片提取得分。代码如下:
my $score_for = { jim => 89, mary => 73, alice => 100, bob => 83 };
my ( $jim, $mary ) = @$score_for{ qw{jim mary} };
print "$jim $mary
";
第二种方式:分别提取得分。代码如下:
my $score_for = { jim => 89, mary => 73, alice => 100, bob => 83 };
$jim = $score_for->{jim};
$mary = $score_for->{mary};
print "$jim $mary
";
21、编写一个子例程计算传入数字的平均值并打印
以下是一个用 Perl 编写的子例程,用于计算传入数字的平均值并打印:
sub calculate_average {
my $sum = 0;
my $count = scalar @_;
foreach my $num (@_) {
$sum += $num;
}
my $average = $sum / $count;
print $average;
}
# 调用示例
calculate_average(1, 2, 3, 4, 5);
22、请编写代码计算并打印传入数字 1、5、18、3、5 的平均值。
以下是使用 Python 语言实现计算传入数字平均值的代码:
numbers = [1, 5, 18, 3, 5]
result = sum(numbers) / len(numbers)
print(result)
若要使用其他语言实现,如 Java,代码如下:
import java.util.Arrays;
public class AverageCalculator {
public static void main(String[] args) {
int[] numbers = {1, 5, 18, 3, 5};
int sum = 0;
for (int number : numbers) {
sum += number;
}
double average = (double) sum / numbers.length;
System.out.println(average);
}
}
23、编写一个求平均值的函数,该函数需要检查传入的参数是否为数字,若不是数字则抛出错误。例如,当传入 1 5 18 bob 3 5 这样的参数时,能正确处理。
以下是实现该功能的代码:
use Scalar::Util 'looks_like_number';
use Carp 'croak';
sub average {
my @numbers = @_;
my $total = 0;
foreach my $number (@numbers) {
if ( not looks_like_number($number) ) {
croak "$number doesn't look like a number";
} else {
$total += $number;
}
}
return $total / @numbers;
}
print average(qw< 1 5 18 bob 3 5>);
在上述代码中,定义了一个名为
average
的函数,它接收任意数量的参数。在函数内部,会遍历每个参数,使用
looks_like_number
函数检查参数是否为数字。如果不是数字,会使用
croak
函数抛出错误;如果是数字,则将其累加到
$total
变量中。最后,返回总和除以参数数量的平均值。
24、请编写一个递归函数 sum 来计算传入参数的总和,如传入 1, 93, 3, 5
以下是实现该功能的代码:
sub sum {
return 0 unless @_;
my ( $head, @tail ) = @_;
return $head + sum(@tail);
}
print sum( 1, 93, 3, 5 );
在这个
sum
函数中,首先检查传入的参数列表是否为空,如果为空则返回 0。然后取出参数列表的第一个元素
$head
和剩余元素
@tail
,将
$head
与递归调用
sum
函数处理
@tail
的结果相加并返回。
25、编写一个正则表达式来匹配美国社会安全号码,格式为 ###-##-####,并使用单词边界确保精确匹配。
d{3}-d{2}-d{4}
26、编写一个 Perl 程序,从标准输入读取内容并打印出来。
以下是一个简单的 Perl 程序示例,用于从标准输入读取内容并打印出来:
while (my $line = <STDIN>) {
print $line;
}
将上述代码保存为一个
.pl
文件,例如
read_input.pl
,然后在终端中运行
perl read_input.pl
,之后你就可以输入内容,按回车键后程序会将输入的内容打印出来。输入完成后,可使用
Ctrl + D
(在 Windows 上是
Ctrl + Z
)结束输入。
27、编写一个 Perl 子程序 make_multiplier,它接受一个数字作为参数,并返回一个新的子程序,新子程序可以将传入的参数乘以原参数。
以下是实现
make_multiplier
子程序的 Perl 代码:
sub make_multiplier {
my $first_number = shift;
return sub {
my $second_number = shift;
return $first_number * $second_number;
};
}
你可以使用以下代码测试这个子程序:
my $times_seven = make_multiplier(7);
my $times_five = make_multiplier(5);
print 21 == $times_seven->(3) ? "yes
" : "no
";
print 20 == $times_five->(4) ? "yes
" : "no
";
28、编写一个 Perl 子程序 sum,使用递归方法计算传入的一组数字的总和。
以下是一个使用递归方法计算传入的一组数字总和的 Perl 子程序示例:
sub sum {
my @numbers = @_;
if (scalar @numbers == 0) {
return 0;
} else {
my $first = shift @numbers;
return $first + sum(@numbers);
}
}
你可以使用以下方式调用这个子程序:
my @nums = (1, 2, 3, 4, 5);
my $result = sum(@nums);
print $result; # 输出 15
29、请说明
print while <>;
语句的功能,并举例说明其使用方式。
print while <>;
`print while <>;` 可以从标准输入或命令行指定的文件中逐行读取内容,并将其打印输出。例如,在命令行中运行 `perl -e 'print while <>;' file.txt` 可以将 `file.txt` 文件的内容逐行打印出来;若不指定文件,程序会等待用户从标准输入输入内容,按 `Ctrl+D`(在 Windows 上是 `Ctrl+Z`)结束输入。
30、编写一个函数,该函数接受一个数字作为参数,返回一个新的函数,新函数接受一个参数并将其与原函数传入的数字相乘。然后使用返回的新函数进行乘法运算并验证结果。
以下是实现该功能的代码:
sub make_multiplier {
my $number = shift;
return sub {
return shift(@_) * $number
};
}
my $times_seven = make_multiplier(7);
my $times_five = make_multiplier(5);
print 21 == $times_seven->(3) ? "yes
" : "no
";
print 20 == $times_five->(4) ? "yes
" : "no
";
代码解释:
make_multiplier
函数接受一个数字参数,返回一个匿名子函数。这个匿名子函数会将传入的参数与
make_multiplier
传入的数字相乘。通过调用
make_multiplier
分别创建了乘以 7 和乘以 5 的函数,并进行了结果验证。
31、编写代码,将命令行参数中的每个单词拆分为字符,再将每个字符转换为其对应的 Unicode 码点,并打印出来,每个单词的码点在一行,码点之间用空格分隔。
以下两种实现方式均可:
方式一:
use strict;
use warnings;
use Encode 'decode';
binmode STDOUT, ':encoding(UTF-8)';
foreach my $word (@ARGV) {
$word = decode('UTF-8', $word);
my @chars = split //, $word;
foreach my $char (@chars) {
$char = ord $char;
print "$char ";
}
print "
";
}
方式二:
use strict;
use warnings;
use utf8::all;
foreach my $word (@ARGV) {
my @chars = split //, $word;
foreach my $char (@chars) {
$char = ord $char;
print "$char ";
}
print "
";
}
32、编写一个程序,将命令行参数中的每个字符转换为其对应的 Unicode 码点并打印出来,同时可以将码点格式化为“U+XXXX”的形式。
以下是实现该功能的代码:
use strict;
use warnings;
use Encode 'decode';
binmode STDOUT, ':encoding(UTF-8)';
foreach my $word (@ARGV) {
$word = decode('UTF-8', $word);
my @chars = split //, $word;
foreach my $char (@chars) {
$char = ord $char;
print "$char ";
}
print "
";
}
或者更简洁的代码:
use strict;
use warnings;
use utf8::all;
foreach my $word (@ARGV) {
my @chars = split //, $word;
foreach my $char (@chars) {
$char = ord $char;
print "$char ";
}
print "
";
}
若要将码点格式化为“U+XXXX”的形式,将
$char = ord $char;
这一行改为:
$char = "U+" . uc sprintf "%04x", ord $char;