Perl与Python编程实例解析

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

© 版权声明

相关文章

暂无评论

none
暂无评论...