编程实例解析:从输入处理到正则表达式应用

内容分享2天前发布
0 0 0

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

和钻石操作符,从用户选择的所有文件中读取所有行,反转这些行的顺序并打印出来

以下是一个满足需求的 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` 的形式,展示匹配位置;若不匹配,会输出未匹配的内容。

© 版权声明

相关文章

暂无评论

none
暂无评论...