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;
}
47、编写一个Perl程序,提示用户输入圆的半径,计算并输出该圆的周长,同时处理输入的半径为负数的情况
以下是实现该功能的Perl程序:
#!/usr/bin/perl
use strict;
use warnings;
print "请输入圆的半径: ";
my $radius = <STDIN>;
chomp $radius;
if ($radius < 0) {
print "输入的半径不能为负数,请输入一个非负数值。
";
} else {
my $circumference = 2 * 3.14159 * $radius;
print "圆的周长是: $circumference
";
}
这个程序首先提示用户输入圆的半径,然后检查输入的半径是否为负数。如果是负数,程序会给出错误提示;如果不是负数,程序会计算并输出圆的周长。
48、编写一个Perl程序,提示用户输入两个数字,将这两个数字相乘并输出结果
以下是实现该功能的Perl程序:
#!/usr/bin/perl
use warnings;
use strict;
print "请输入第一个数字: ";
my $num1 = <STDIN>;
chomp($num1);
print "请输入第二个数字: ";
my $num2 = <STDIN>;
chomp($num2);
my $result = $num1 * $num2;
print "这两个数字的乘积是: $result
";
该程序首先提示用户输入两个数字,然后将输入的内容去除换行符,接着将两个数字相乘,最后输出结果。
49、编写一个Perl程序,提示用户输入一个字符串和一个数字,将该字符串重复指定的次数并输出结果,要求字符串出现在单独的行上
以下是实现该功能的Perl程序:
#!/usr/bin/perl
use strict;
use warnings;
print "请输入一个字符串: ";
chomp(my $string = <STDIN>);
print "请输入一个数字: ";
chomp(my $num = <STDIN>);
for (my $i = 0; $i < $num; $i++) {
print "$string
";
}
该程序首先提示用户输入一个字符串和一个数字,然后使用
for
循环将字符串重复指定的次数,并将每次重复的字符串输出到单独的一行。
50、编写一个Perl程序,提示用户输入多行文本,然后按相反的顺序输出这些行
以下是一个能实现该功能的Perl程序:
#!/usr/bin/perl
use strict;
use warnings;
print "请输入多行文本,输入结束后按 Ctrl+D(Unix/Linux)或 Ctrl+Z(Windows):
";
my @lines;
while (my $line = <STDIN>) {
chomp $line;
push @lines, $line;
}
foreach my $line (reverse @lines) {
print $line, "
";
}
该程序首先提示用户输入多行文本,接着使用
while
循环从标准输入读取每一行,将其存入数组
@lines
中。输入结束后,利用
reverse
函数反转数组,最后通过
foreach
循环按相反顺序输出每一行。
51、编写程序,让用户输入一些行,然后按 Ctrl – D(或 Ctrl – Z)结束输入,将输入的行逆序输出
以下是使用 Python 实现该功能的代码:
lines = []
while True:
try:
line = input()
lines.append(line)
except EOFError:
break
for line in reversed(lines):
print(line)
在上述代码中,首先创建一个空列表
lines
用于存储用户输入的每一行。通过
while True
循环不断接收用户输入,将每一行添加到
lines
列表中。当用户按下 Ctrl – D(在 Windows 系统中是 Ctrl – Z)时,
input()
函数会抛出
EOFError
异常,此时使用
break
语句跳出循环。最后,使用
reversed()
函数将
lines
列表逆序,并逐行输出。
52、编写程序,让用户输入一个字符串和一个数字,将字符串重复数字指定的次数并输出,要求字符串在单独的行上
以下是使用Python实现该功能的代码:
string = input("请输入一个字符串:")
number = int(input("请输入一个数字:"))
for _ in range(number):
print(string)
这段代码首先通过
input
函数获取用户输入的字符串和数字,将数字转换为整数类型,然后使用
for
循环将字符串重复指定的次数并逐行输出。
53、编写一个子程序,用于计算传入参数的总和
以下是一个用 Perl 语言编写的子程序,用于计算传入参数的总和:
sub sum {
my $total = 0;
foreach my $num (@_) {
$total += $num;
}
return $total;
}
你可以使用以下方式调用这个子程序:
my $result = sum(1, 2, 3, 4, 5);
print $result; # 输出 15
54、计算1到1000的数字总和并输出
这里给出使用Python和Perl计算1到1000数字总和并输出的通用示例。
Python代码:
print(sum(range(1, 1001)))
Perl代码:
my $sum = 0;
for (my $i = 1; $i <= 1000; $i++) {
$sum += $i;
}
print $sum;
55、编写一个 greet 子程序,使用状态变量记住最后一个与之交谈的人
以下是一个使用 Perl 语言实现的
greet
子程序示例,它使用状态变量记住最后一个与之交谈的人:
sub greet {
my $name = shift;
state $last_person;
if ($last_person) {
print "Hi $name! $last_person is also here!
";
} else {
print "Hi $name! You are the first one here!
";
}
$last_person = $name;
}
# 测试示例
&greet("Fred");
&greet("Barney");
在这个示例中,
state
关键字用于声明一个状态变量
$last_person
,它在子程序调用之间保留其值。每次调用
greet
子程序时,它会根据
$last_person
是否有值来输出不同的问候语,并更新
$last_person
为当前的名字。
56、编写一个 greet 子程序,使用状态变量存储所有与之交谈过的人的名字
以下是一个使用 Perl 语言实现的
greet
子程序示例:
sub greet {
my $name = shift;
state @seen_names = ();
if (@seen_names == 0) {
print "Hi $name! You are the first one here!
";
} else {
my $seen_list = join " ", @seen_names;
print "Hi $name! I've seen: $seen_list
";
}
push @seen_names, $name;
}
# 测试示例
greet( "Fred" );
greet( "Barney" );
greet( "Wilma" );
greet( "Betty" );
在这个子程序中,使用了
state
关键字声明了一个状态变量
@seen_names
,用于存储所有与之交谈过的人的名字。每次调用
greet
子程序时,会根据
@seen_names
的情况输出不同的欢迎信息,并将当前名字添加到
@seen_names
数组中。
57、编写程序,将用户选择的所有文件中的行进行反转并输出
以下是一个使用Python实现该功能的示例代码:
import sys
# 遍历命令行参数中指定的文件
for file_name in sys.argv[1:]:
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.rstrip())
except FileNotFoundError:
print(f'文件 {file_name} 未找到。')
except Exception as e:
print(f'处理文件 {file_name} 时出现错误: {e}')
将上述代码保存为一个Python文件(例如
reverse_lines.py
),然后在命令行中运行,传入要处理的文件名,如
python reverse_lines.py file1.txt file2.txt
。
58、编写程序,让用户输入一些行,然后将这些行右对齐到第20列输出
以下是一个简单的 Perl 程序示例来实现该功能:
while (my $line = <STDIN>) {
chomp $line;
printf "%20s
", $line;
}
此程序会持续读取用户输入,逐行处理。
chomp
函数用于去除每行末尾的换行符,
printf
函数借助
%20s
格式说明符将每行右对齐到第 20 列输出。
59、编写代码实现读取用户输入的多行文本,将每行文本右对齐到第 20 列输出,并打印一个列宽为 75 的标尺行
以下是一个用Python实现该功能的示例代码:
# 打印标尺行
ruler = ''.join([str((i % 10)) for i in range(1, 76)])
print(ruler)
# 读取用户输入的多行文本
lines = []
print('请输入多行文本,输入空行结束输入:')
while True:
line = input()
if not line:
break
lines.append(line)
# 右对齐到第20列输出
for line in lines:
print(line.rjust(20))
这段代码首先打印了一个列宽为 75 的标尺行,然后读取用户输入的多行文本,以空行作为输入结束的标志。最后,将每行文本右对齐到第 20 列并输出。
60、编写代码实现先询问用户列宽,然后读取用户输入的多行文本,将每行文本右对齐到指定列宽输出,并打印一个合适长度的标尺行
以下是一个Python代码示例来实现该功能:
# 询问用户列宽
width = int(input("请输入列宽: "))
# 读取用户输入的多行文本
lines = []
print("请输入多行文本,输入空行结束输入:")
while True:
line = input()
if not line:
break
lines.append(line)
# 打印标尺行
ruler = ''.join(str(i % 10) for i in range(1, width + 1))
print(ruler)
# 将每行文本右对齐到指定列宽输出
for line in lines:
print(line.rjust(width))
这段代码首先会询问用户列宽,接着让用户输入多行文本,输入空行时结束输入。然后打印一个合适长度的标尺行,最后将每行文本右对齐到指定列宽输出。
61、编写代码实现根据用户输入的名字,从一个哈希表中查找并输出对应的姓氏
以下是一个使用 Python 实现的示例代码:
# 定义一个哈希表(Python 中为字典)
name_dict = {
"张三": "张",
"李四": "李",
"王五": "王"
}
# 获取用户输入
input_name = input("请输入名字:")
# 查找对应的姓氏
last_name = name_dict.get(input_name)
if last_name:
print(f"对应的姓氏是:{last_name}")
else:
print("未找到对应的姓氏")
以上代码定义了一个名字与姓氏对应的字典,然后获取用户输入的名字,尝试从字典中查找对应的姓氏并输出。如果未找到,则提示未找到对应的姓氏。
62、编写一个程序,根据用户输入的名字,从哈希表中查找并输出对应的姓氏。哈希表中存储了一些名字和姓氏的对应关系,如fred对应flintstone,barney对应rubble,wilma对应flintstone。
以下是一个使用 Perl 语言实现的示例程序:
#!/usr/bin/perl
use strict;
use warnings;
# 定义哈希表
my %name_surname = (
'fred' => 'flintstone',
'barney' => 'rubble',
'wilma' => 'flintstone'
);
# 获取用户输入
print "请输入一个名字: ";
chomp(my $input_name = <STDIN>);
$input_name = lc($input_name);
# 查找并输出对应的姓氏
if (exists $name_surname{$input_name}) {
print "对应的姓氏是: $name_surname{$input_name}
";
} else {
print "未找到该名字对应的姓氏。
";
}
该程序首先定义了一个哈希表
%name_surname
存储名字和姓氏的对应关系。然后获取用户输入的名字,将其转换为小写后在哈希表中查找。如果找到对应的姓氏,则输出该姓氏;否则,提示未找到。
63、编写一个程序,找出环境变量哈希表%ENV中所有键的最大长度,并将环境变量的键和值以两列的形式输出,键左对齐,最大长度作为键列的宽度。
以下是实现该功能的 Perl 代码:
use strict;
use warnings;
# 找出所有键的最大长度
my $max_length = 0;
foreach my $key (keys %ENV) {
my $length = length($key);
$max_length = $length if $length > $max_length;
}
# 输出环境变量的键和值
foreach my $key (sort keys %ENV) {
printf "%-${max_length}s %s
", $key, $ENV{$key};
}
这段代码首先遍历
%ENV
哈希表,找出所有键中的最大长度。然后,使用
printf
函数以两列形式输出键和值,键左对齐,宽度为最大长度。
64、编写一个程序,从命令行参数指定的文件中读取内容,如果某行包含fred,则输出该行。
以下是一个满足需求的 Perl 程序示例:
#!/usr/bin/perl
use strict;
use warnings;
# 检查是否提供了文件名
if (@ARGV != 1) {
die "Usage: $0 <filename>
";
}
# 获取文件名
my $filename = $ARGV[0];
# 打开文件
open(my $file, '<', $filename) or die "无法打开文件 $filename: $!
";
# 逐行读取文件
while (my $line = <$file>) {
if ($line =~ /fred/i) {
print $line;
}
}
# 关闭文件
close($file);
将上述代码保存为一个
.pl
文件,例如
filter_fred.pl
,然后在命令行中运行
perl filter_fred.pl <文件名>
即可。
65、修改一个正则表达式模式,使其能匹配“fred”或“Fred”。
可将正则表达式模式改为
/[fF]red/
,也可以尝试
/(f|F)red/
或
/fred|Fred/
,不过字符类
/[fF]red/
效率更高。
66、修改一个正则表达式模式,使其能匹配点号(.)
可以将正则表达式模式修改为
/./
,因为反斜杠是必需的,点号是元字符;也可以使用字符类,即
/[.]/
。
67、修改一个字符串匹配模式,使其能匹配以大写字母开头,后跟一个或多个小写字母的字符串。
可使用正则表达式
^[A-Z][a-z]+$
来匹配以大写字母开头,后跟一个或多个小写字母的字符串。若要修改原有的匹配模式,将其替换为此正则表达式即可。
68、使用稍微不同的正则表达式实现一个功能:从标准输入读取每行内容,若该行能匹配正则表达式,则输出匹配信息及捕获组内容;若不匹配,则输出未匹配信息。
#!/usr/bin/perl
use 5.010;
while (<STDIN>) {
chomp;
if (/(w*a)/) {
print "Matched: |$`<$&>$'|
";
print "$1 contains '$1'
"; # The new output line
} else {
print "No match: |$_|
";
}
}
69、编写一个Perl程序,对标准输入(STDIN)的输入行执行模式匹配。该模式应匹配以 ‘a’ 结尾的单词,并打印出包括 $1 在内的特定信息。这个程序的代码是什么?
#!/usr/bin/perl
while (<STDIN>) {
chomp;
if (/([w]*a)/) {
print "Matched: |$`<$&>$'|
";
print "$1 contains '$1'
";
} else {
print "No match: |$_|
";
}
}
70、创建一个模式,在对 $what 进行插值后得到类似于 /(fred|barney){3}/ 的模式。为什么需要括号?
可使用代码
my $what = 'fred|barney'; my $pattern = qr/(($what)){3}/;
来创建模式。括号是必需的,因为没有括号时,竖线分隔符的优先级较低,会将模式分成两部分,如
/fred|barney{3}/
会匹配以
fred
开头或
barney
重复 3 次的内容;而有括号
/(fred|barney){3}/
会匹配整个字符串是
fred
或
barney
重复 3 次的情况。
71、编写一个模式,使得 $what 插值后能实现类似 /(fred|barney){3}/ 的效果
可以使用如下代码实现,先在模式测试程序顶部设置
$what
,然后构建匹配模式。示例代码如下:
my $what = 'fred|barney';
my $pattern = qr/($what){3}/;
这里使用
qr
操作符创建正则表达式对象,能匹配
$what
所代表内容的三次连续重复。
72、编写一个程序,接收一个命令行参数作为文件名,将文件中所有的 Fred 替换为 Larry,然后将处理后的内容输出到一个新文件,新文件的扩展名改为 .out
以下是实现该功能的 Perl 代码示例:
#!/usr/bin/perl
use strict;
use warnings;
# 检查是否提供了命令行参数
if (@ARGV != 1) {
die "请提供一个文件名作为命令行参数。
";
}
# 获取输入文件名
my $input_file = $ARGV[0];
# 生成输出文件名
my $output_file = $input_file . ".out";
# 打开输入文件
open(my $in_fh, '<', $input_file) or die "无法打开文件 $input_file: $!
";
# 打开输出文件
open(my $out_fh, '>', $output_file) or die "无法打开文件 $output_file: $!
";
# 逐行读取输入文件
while (my $line = <$in_fh>) {
# 替换所有的 Fred(不区分大小写)为 Larry
$line =~ s/Fred/Larry/gi;
# 将处理后的行写入输出文件
print $out_fh $line;
}
# 关闭文件句柄
close($in_fh);
close($out_fh);
print "文件处理完成,结果已保存到 $output_file。
";
将上述代码保存为一个
.pl
文件,例如
replace_fred.pl
,然后在命令行中运行:
perl replace_fred.pl your_input_file.txt
其中
your_input_file.txt
是你要处理的文件名。处理后的文件将保存为
your_input_file.txt.out
。