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;
}
49、编写程序,让用户输入一些行,对这些行进行排序并输出(输出在一行)
以下是一个使用 Python 实现的示例代码:
lines = []
while True:
line = input()
if not line:
break
lines.append(line)
lines.sort()
result = ' '.join(lines)
print(result)
这段代码会持续让用户输入行,直到用户输入空行。然后对输入的行进行排序,并将排序后的行用空格连接成一行输出。
50、编写一个Perl程序,从用户那里读取一些行(按Ctrl – D或Ctrl – Z结束输入),反转这些行的顺序,然后打印出来。
print reverse <>;
51、编写一个Perl程序,用户输入1到7之间的一些数字(每行一个,按Ctrl – D结束输入),程序从列表@names = qw/ fred betty barney dino wilma pebbles bamm – bamm /中打印出对应的名字。同时,考虑如何处理索引,以便用户可以从1到7计数,而数组的索引是从0到6。
以下是实现该功能的Perl程序:
@names = qw/ fred betty barney dino wilma pebbles bamm - bamm /;
print "Enter some numbers from 1 to 7, one per line, then press Ctrl - D:
";
chomp(@numbers = <STDIN>);
foreach (@numbers) {
print "$names[ $_ - 1 ]
";
}
在这个程序中,我们需要从用户输入的数字中减去1,这样用户可以从1到7计数,而数组索引从0到6。
另一种实现方式是在
@names
数组中添加一个虚拟项:
@names = qw/ dummy_item fred betty barney dino wilma pebbles bamm - bamm /;
print "Enter some numbers from 1 to 7, one per line, then press Ctrl - D:
";
chomp(@numbers = <STDIN>);
foreach (@numbers) {
print "$names[ $_ ]
";
}
此外,建议检查用户输入的索引是否在1到7的范围内。
52、编写一个名为total的Perl子例程,它接受一个数字列表作为参数,并返回这些数字的总和。同时,考虑当子例程使用空参数列表调用时如何处理返回值。
可以使用以下代码实现:
sub total {
my $sum = 0; # 初始化为0,避免空列表时返回undef
foreach (@_) {
$sum += $_;
}
return $sum;
}
在这个子例程中,
$sum
初始化为0。使用
foreach
循环遍历参数列表
@_
,将每个元素累加到
$sum
中。最后返回
$sum
。当参数列表为空时,由于
$sum
初始化为0,所以会返回0。
53、编写一个子程序来计算传入参数的总和
以下是一个使用 Python 编写的子程序来计算传入参数的总和:
# 定义一个函数来计算传入参数的总和
def sum_args(*args):
return sum(args)
# 调用函数并传入参数
result = sum_args(1, 2, 3, 4, 5)
print(result)
在这个示例中,定义了一个名为
sum_args
的函数,使用
*args
来接收任意数量的参数,然后使用
sum()
函数来计算这些参数的总和。
54、调用合适的子程序计算1到1000的数字总和
可使用
List::Util
模块的
sum
子程序进行计算,示例代码如下:
use List::Util qw(sum);
my $total = sum( 1..1000 ); # 结果为500500
55、编写一个子程序来计算传入参数的平均值,再编写一个子程序找出传入参数中大于平均值的元素
以下是使用Perl语言实现这两个子程序的代码:
# 计算平均值的子程序
sub calculate_average {
my $sum = 0;
my $count = scalar @_;
foreach my $num (@_) {
$sum += $num;
}
return $sum / $count;
}
# 找出大于平均值的元素的子程序
sub find_greater_than_average {
my $avg = calculate_average(@_);
my @result;
foreach my $num (@_) {
if ($num > $avg) {
push @result, $num;
}
}
return @result;
}
# 测试代码
my @numbers = (1, 2, 3, 4, 5);
my $average = calculate_average(@numbers);
my @greater_than_avg = find_greater_than_average(@numbers);
print "平均值: $average
";
print "大于平均值的元素: @greater_than_avg
";
以上代码定义了两个子程序
calculate_average
和
find_greater_than_average
,分别用于计算传入参数的平均值和找出大于平均值的元素。最后进行了简单的测试,输出平均值和大于平均值的元素。
56、编写一个 greet 子程序,使用状态变量记住最后一个打招呼的人
以下是实现该功能的代码:
use v5.10;
greet( 'Fred' );
greet( 'Barney' );
sub greet {
state $last_person;
my $name = shift;
print "Hi $name! ";
if( defined $last_person ) {
print "$last_person is also here!
";
} else {
print "You are the first one here!
";
}
$last_person = $name;
}
57、编写一个 greet 子程序,使用状态变量记住所有打招呼的人
以下是实现该功能的代码:
use v5.10;
greet( 'Fred' );
greet( 'Barney' );
greet( 'Wilma' );
greet( 'Betty' );
sub greet {
state @names;
my $name = shift;
print "Hi $name! ";
if( @names ) {
print "I've seen: @names
";
} else {
print "You are the first one here!
";
}
push @names, $name;
}
这段代码定义了一个
greet
子程序,使用状态数组
@names
来记住所有打招呼的人。每次调用
greet
时,会根据
@names
是否为空来输出不同的欢迎信息,并将当前名字添加到
@names
数组中。
58、编写一个程序,将用户输入的文件内容按行反转后输出
以下是一个使用Python实现将用户输入的文件内容按行反转后输出的示例代码:
# 获取用户输入的文件名
file_name = input('请输入文件名:')
try:
# 打开文件并读取所有行
with open(file_name, 'r', encoding='utf-8') as file:
lines = file.readlines()
# 反转行顺序
reversed_lines = lines[::-1]
# 输出反转后的内容
for line in reversed_lines:
print(line.strip())
except FileNotFoundError:
print('未找到指定的文件,请检查文件名是否正确。')
代码解释
获取文件名
:通过
input
函数获取用户输入的文件名。
读取文件内容
:使用
open
函数以只读模式打开文件,并使用
readlines
方法读取文件的所有行,将其存储在
lines
列表中。
反转行顺序
:使用切片
[::-1]
将
lines
列表中的元素顺序反转,存储在
reversed_lines
列表中。
输出反转后的内容
:遍历
reversed_lines
列表,使用
strip
方法去除每行末尾的换行符,并将其打印输出。
异常处理
:使用
try-except
语句捕获
FileNotFoundError
异常,如果文件不存在,则输出错误信息。
59、编写一个程序,读取用户输入的多行文本,然后将每行文本右对齐输出,宽度为20个字符
以下是使用Python语言实现的程序示例:
while True:
try:
line = input()
print(line.rjust(20))
except EOFError:
break
此程序会持续读取用户输入的每一行文本,直至遇到文件结束符(EOF),随后把每行文本右对齐输出,宽度设定为20个字符。
在不同操作系统中,触发EOF的方式有所不同,在Windows系统里可按
Ctrl + Z
,在Unix/Linux系统中则按
Ctrl + D
。
60、编写一个程序,使用
reverse
和钻石操作符,从用户选择的所有文件中读取所有行,反转这些行的顺序并打印出来
reverse
以下是一个满足需求的 Perl 程序示例:
#!/usr/bin/perl
use strict;
use warnings;
my @lines;
while (my $line = <>) {
push @lines, $line;
}
my @reversed_lines = reverse @lines;
foreach my $reversed_line (@reversed_lines) {
print $reversed_line;
}
代码解释:
use strict;
和
use warnings;
:开启严格模式和警告信息,有助于编写更规范的代码。
my @lines;
:定义一个数组
@lines
,用于存储从文件中读取的所有行。
while (my $line = <>)
:使用钻石操作符
<>
从用户指定的文件中逐行读取内容。每次循环读取一行,并将其存储在变量
$line
中。
push @lines, $line;
:将读取到的每一行添加到数组
@lines
中。
my @reversed_lines = reverse @lines;
:使用
reverse
操作符反转数组
@lines
中元素的顺序,并将结果存储在新数组
@reversed_lines
中。
foreach my $reversed_line (@reversed_lines)
:遍历反转后的数组
@reversed_lines
。
print $reversed_line;
:打印反转后的每一行。
使用方法:
将上述代码保存为一个
.pl
文件,例如
reverse_lines.pl
,然后在命令行中运行:
perl reverse_lines.pl file1.txt file2.txt ...
其中
file1.txt
,
file2.txt
等是你要处理的文件名称。程序会依次读取这些文件的内容,反转行的顺序并打印出来。
61、编写一个程序,提示用户输入一些行,然后将这些行以20个字符宽的列格式打印出来
以下是一个Python程序示例来实现该功能:
lines = []
while True:
line = input("请输入一行内容(输入空行结束):")
if not line:
break
lines.append(line)
for line in lines:
print(f'{line:<20}')
该程序会不断提示用户输入行内容,直到用户输入空行。然后将用户输入的每一行以20个字符宽的列格式打印出来,不足20个字符的行将在右侧用空格补齐。
62、编写一个程序,先提示用户输入列宽,然后提示用户输入一些行,最后将这些行以用户指定的列宽格式打印出来,并生成一个至少与所需长度一样长的标尺行
以下是一个满足需求的 Perl 程序示例:
#!/usr/bin/perl
use strict;
use warnings;
# 提示用户输入列宽
print "请输入列宽: ";
chomp(my $width = <STDIN>);
# 提示用户输入行,直到输入空行结束
my @lines;
print "请输入一些行,输入空行结束输入:";
while (my $line = <STDIN>) {
chomp($line);
last if $line eq '';
push @lines, $line;
}
# 生成标尺行
my $ruler = '';
for (my $i = 1; $i <= $width; $i++) {
$ruler .= $i % 10;
}
# 打印标尺行
print $ruler, "
";
# 按指定列宽打印输入的行
foreach my $line (@lines) {
my $formatted_line = substr($line, 0, $width);
print $formatted_line, "
";
}
这个程序首先提示用户输入列宽,接着让用户输入一些行,输入空行时结束输入。然后程序会生成一个至少与指定列宽一样长的标尺行并打印出来,最后将用户输入的行按指定列宽格式打印。
63、编写一个程序,使用哈希存储名字和姓氏的对应关系,提示用户输入一个名字,然后打印出该名字对应的全名
以下是一个使用Perl语言实现该功能的示例代码:
use v5.10;
# 定义一个哈希存储名字和姓氏的对应关系
my %name_map = ( 'Fred' => 'Flintstone', 'Barney' => 'Rubble', 'Wilma' => 'Flintstone');
# 提示用户输入一个名字
print "请输入一个名字: ";
chomp(my $input_name = <STDIN>);
# 检查输入的名字是否在哈希中
if (exists $name_map{$input_name}) {
my $full_name = "$input_name $name_map{$input_name}";
say "该名字对应的全名是: $full_name";
} else {
say "未找到该名字对应的信息。";
}
上述代码首先定义了一个哈希
%name_map
来存储名字和姓氏的对应关系,接着提示用户输入一个名字,检查该名字是否存在于哈希中,如果存在则打印出对应的全名,不存在则给出未找到信息的提示。
64、编写一个程序,让用户输入一个名字,然后从哈希中查找对应的姓氏并输出。如果用户输入的名字不在哈希中,给出相应提示。
以下是一个用 Perl 语言实现的示例代码:
use v5.10;
# 定义一个包含名字和姓氏的哈希
my %name_surname = ( 'Fred' => 'Flintstone', 'Barney' => 'Rubble', 'Wilma' => 'Flintstone');
# 提示用户输入名字
print "请输入一个名字: ";
chomp(my $input_name = <STDIN>);
# 检查输入的名字是否在哈希中
if (exists $name_surname{$input_name}) {
say "$input_name 的姓氏是 $name_surname{$input_name}";
} else {
say "未找到 $input_name 的姓氏信息。";
}
这段代码首先定义了一个包含名字和姓氏的哈希,然后提示用户输入一个名字。接着检查输入的名字是否存在于哈希中,如果存在则输出对应的姓氏,不存在则给出相应提示。
65、编写一个程序,从标准输入读取一系列单词,统计每个单词出现的次数,并输出每个单词及其出现次数。
以下是一个使用 Python 实现的示例程序:
word_count = {}
while True:
try:
word = input().strip()
if not word:
break
if word in word_count:
word_count[word] += 1
else:
word_count[word] = 1
except EOFError:
break
for word, count in word_count.items():
print(f'{word}: {count}')
这个程序会不断从标准输入读取单词,直到遇到文件结束符(EOF)或空行。它使用一个字典
word_count
来统计每个单词的出现次数。最后,程序会遍历字典并输出每个单词及其出现次数。
66、编写一个程序,打印环境变量表,将环境变量名和对应的值分两列输出,环境变量名左对齐,并且根据最长的环境变量名调整列宽。
以下是一个使用 Python 实现的程序示例:
import os
# 获取所有环境变量
env_vars = os.environ
# 找到最长的环境变量名长度
max_length = max(len(key) for key in env_vars.keys())
# 打印环境变量表
for key, value in env_vars.items():
# 左对齐环境变量名,并根据最长长度调整列宽
print(f'{key.ljust(max_length)} {value}')
这个程序首先导入
os
模块,使用
os.environ
获取所有环境变量。然后找到最长的环境变量名长度,最后遍历环境变量,使用
ljust
方法将环境变量名左对齐,并根据最长长度调整列宽,将环境变量名和对应的值分两列输出。
67、编写一个程序,从标准输入或文件中读取内容,打印出包含字符串 ‘fred’ 的行。
以下是实现该功能的Perl程序示例:
while (<>) {
if (/fred/) {
print;
}
}
该程序会循环读取标准输入或文件中的每一行,若某行包含字符串
fred
,则将该行打印出来。
68、将一个正则表达式模式改为能匹配 ‘fred’ 或 ‘Fred’ 的正则表达式,应该如何修改?
可以将模式改为
/[fF]red/
,也可以尝试
/(f|F)red/
或
/fred|Fred/
,其中使用字符类的
/[fF]red/
更高效。
69、将匹配特定内容的正则表达式模式改为匹配点号 ‘.’ 的正则表达式,应该如何修改?
可以将模式改为 /./,因为点号是元字符,需要反斜杠转义;也可以使用字符类,写成 /[.]/。
70、将原模式改为匹配以大写字母开头,后面跟一个或多个小写字母的正则表达式,应该如何修改?
将原模式改为 /[A-Z][a-z]+/。
71、编写代码,使输入的行中同时包含 ‘wilma’ 和 ‘fred’ 时打印该行,应该如何实现?
可以使用以下几种方式实现:
方式一
:使用嵌套
if
语句,先检查是否匹配
'wilma'
,再检查是否匹配
'fred'
,匹配则打印该行。代码如下:
while (<>) {
if (/wilma/) {
if (/fred/) {
print;
}
}
}
方式二
:使用正则表达式匹配
'wilma'
在前
'fred'
在后或者
'fred'
在前
'wilma'
在后的情况,匹配则打印该行。代码如下:
while (<>) {
if (/wilma.*fred|fred.*wilma/) {
print;
}
}
方式三
:使用逻辑与运算符,在同一个
if
条件中同时检查是否匹配
'wilma'
和
'fred'
,匹配则打印该行。代码如下:
while (<>) {
if (/wilma/ && /fred/) {
print;
}
}
其中,使用逻辑与运算符的方式更高效、更具扩展性。
72、有一种简单的方法可以实现输出 ‘before
after’,若输出未按此预期显示,说明选择了困难的方法,请问该如何实现这个输出?
可以使用下面的程序来实现该输出:
while (<>) {
chomp;
if (/YOUR_PATTERN_GOES_HERE/) {
print "Matched: |$`<$&>$'|
";
} else {
print "No match: |$_|
";
}
}
需要将
'YOUR_PATTERN_GOES_HERE'
替换为实际的正则表达式模式。
73、编写一个用于模式测试程序的正则表达式,使其能匹配以 ‘a’ 结尾的单词,应该如何编写?
下面是一个使用正则表达式匹配以字母
‘a’
结尾的单词的示例:
正则表达式:
/w*a/
解释:
–
表示单词边界,确保匹配的是完整的单词。
–
w*
匹配零个或多个字母数字字符(包括下划线)。
–
a
匹配字母
‘a’
。
– 最后的
再次确保匹配的是以
‘a’
结尾的完整单词。
这个正则表达式可以用于查找所有以
‘a’
结尾的单词。
74、有一个操作,若输出未呈现 before
after 的形式,说明采用了困难的方法。问该如何实现该操作,使得输出呈现 before
after 的形式?
可以使用以下模式测试程序来实现该操作。程序代码如下:
while (<>) {
chomp;
if (/YOUR_PATTERN_GOES_HERE/) {
print "Matched: |$`<$&>$'|
";
} else {
print "No match: |$_|
";
}
}
将需要测试的模式替换掉代码中的
YOUR_PATTERN_GOES_HERE
,程序会对输入的每一行进行检查,若匹配,会使用特殊匹配变量
$``,
$&
和
$’
输出类似
before
after` 的形式,展示匹配位置;若不匹配,会输出未匹配的内容。