Perl语言入门-第九章-用正则表达式处理文本-习题
1. 题目
2. 代码与输出
1 #-----------------------------------------------------------#
2 # Source: Learning Perl, chapter9,exercise-1
3 # Date: 2012-01-19
4 # Author: xiaodongrush
5 #-----------------------------------------------------------#
6 use 5.010;
7 @array = qw {
8 fredfredfred
9 fredfredbarney
10 barneyfredfred
11 barneybarneybarney
12 fred|barney
13 };
14 @content = qw {
15 fred fred|barney
16 };
17 foreach $what(@content) {
18 say "\$what = $what";
19 say "\@array = (@array)";
20 foreach $text(@array) {
21 if($text =~ m/(?:$what){3}/) {
22 say "<$`><$&><$'>";
23 }
24 }
25 say "----------------------------";
26 }
27 <STDIN>;
28 #-----------------------------------------------------------#
29 # 将某个字符串重复3次,注意这个字符串可能包含或|这样的字符,因此将其用括号
30 # 括起来就好了
31 #-----------------------------------------------------------#
2 # Source: Learning Perl, chapter9,exercise-1
3 # Date: 2012-01-19
4 # Author: xiaodongrush
5 #-----------------------------------------------------------#
6 use 5.010;
7 @array = qw {
8 fredfredfred
9 fredfredbarney
10 barneyfredfred
11 barneybarneybarney
12 fred|barney
13 };
14 @content = qw {
15 fred fred|barney
16 };
17 foreach $what(@content) {
18 say "\$what = $what";
19 say "\@array = (@array)";
20 foreach $text(@array) {
21 if($text =~ m/(?:$what){3}/) {
22 say "<$`><$&><$'>";
23 }
24 }
25 say "----------------------------";
26 }
27 <STDIN>;
28 #-----------------------------------------------------------#
29 # 将某个字符串重复3次,注意这个字符串可能包含或|这样的字符,因此将其用括号
30 # 括起来就好了
31 #-----------------------------------------------------------#
1 #-----------------------------------------------------------#
2 # Source: Learning Perl, chapter9,exercise-2
3 # Date: 2012-01-19
4 # Author: xiaodongrush
5 #-----------------------------------------------------------#
6 use 5.010;
7 $input_file = $ARGV[0];
8 $output_file = $ARGV[0] . ".out";
9 unless(!open IN, "<$input_file") {
10 say "Can't read <$input_file> !";
11 }
12 unless(open OUT, ">$output_file") {
13 say "Can't write <$output_file> !";
14 }
15 while(<IN>) {
16 s/Fred/Larry/gi;
17 print OUT $_;
18 }
19 #-----------------------------------------------------------#
20 # 只读<,只写>,追加写>>,默认就是读写
21 #-----------------------------------------------------------#
2 # Source: Learning Perl, chapter9,exercise-2
3 # Date: 2012-01-19
4 # Author: xiaodongrush
5 #-----------------------------------------------------------#
6 use 5.010;
7 $input_file = $ARGV[0];
8 $output_file = $ARGV[0] . ".out";
9 unless(!open IN, "<$input_file") {
10 say "Can't read <$input_file> !";
11 }
12 unless(open OUT, ">$output_file") {
13 say "Can't write <$output_file> !";
14 }
15 while(<IN>) {
16 s/Fred/Larry/gi;
17 print OUT $_;
18 }
19 #-----------------------------------------------------------#
20 # 只读<,只写>,追加写>>,默认就是读写
21 #-----------------------------------------------------------#
1 #-----------------------------------------------------------#
2 # Source: Learning Perl, chapter9,exercise-3
3 # Date: 2012-01-19
4 # Author: xiaodongrush
5 #-----------------------------------------------------------#
6 use 5.010;
7 $text = "fred&wilma&fred&wilma&fred&wima";
8 say "text = $text";
9 @array = split /fred/gi, $text;
10 foreach(@array) {
11 s/wilma/Fred/gi;
12 }
13 $text = join Wilma, @array;
14 say "text = $text";
15 <STDIN>;
16 #-----------------------------------------------------------#
17 #1.该解法是用Fred作为分割符,将字符串分开,然后,将分开的
18 # 字符串中的wilma环卫Fred,然后再用Wilma将分开的字符串连起来
19 #2.书中解法是,首先对字符串chomp,保证不含\n,然后将Fred都换为
20 # \n,接着讲Wilma都换为Fred,最后将\n都换为Wilma
21 #-----------------------------------------------------------#
2 # Source: Learning Perl, chapter9,exercise-3
3 # Date: 2012-01-19
4 # Author: xiaodongrush
5 #-----------------------------------------------------------#
6 use 5.010;
7 $text = "fred&wilma&fred&wilma&fred&wima";
8 say "text = $text";
9 @array = split /fred/gi, $text;
10 foreach(@array) {
11 s/wilma/Fred/gi;
12 }
13 $text = join Wilma, @array;
14 say "text = $text";
15 <STDIN>;
16 #-----------------------------------------------------------#
17 #1.该解法是用Fred作为分割符,将字符串分开,然后,将分开的
18 # 字符串中的wilma环卫Fred,然后再用Wilma将分开的字符串连起来
19 #2.书中解法是,首先对字符串chomp,保证不含\n,然后将Fred都换为
20 # \n,接着讲Wilma都换为Fred,最后将\n都换为Wilma
21 #-----------------------------------------------------------#
1 #-----------------------------------------------------------#
2 # Source: Learning Perl, chapter9,exercise-4
3 # Date: 2012-01-19
4 # Author: xiaodongrush
5 #-----------------------------------------------------------#
6 use 5.010;
7 $^I = ".bak";
8 $text = "## Copyright (C) 2012 by Yours Truly\n";
9 while(<>) {
10 if(/#!/) {
11 $_ = $_ . $text;
12 }
13 print $_;
14 }
15 #-----------------------------------------------------------#
16 # 1. /i表示忽略大小写,/g表示全局匹配
17 # 2. $^I,在读入文件假设是word.txt,首先将其改名为word.txt.out,
18 # 然后创建一个空的word.txt文件,接着,word.txt.out的每一行,
19 # 并且通过print函数写入到word.txt文件中。
20 #-----------------------------------------------------------#
2 # Source: Learning Perl, chapter9,exercise-4
3 # Date: 2012-01-19
4 # Author: xiaodongrush
5 #-----------------------------------------------------------#
6 use 5.010;
7 $^I = ".bak";
8 $text = "## Copyright (C) 2012 by Yours Truly\n";
9 while(<>) {
10 if(/#!/) {
11 $_ = $_ . $text;
12 }
13 print $_;
14 }
15 #-----------------------------------------------------------#
16 # 1. /i表示忽略大小写,/g表示全局匹配
17 # 2. $^I,在读入文件假设是word.txt,首先将其改名为word.txt.out,
18 # 然后创建一个空的word.txt文件,接着,word.txt.out的每一行,
19 # 并且通过print函数写入到word.txt文件中。
20 #-----------------------------------------------------------#
1 #-----------------------------------------------------------#
2 # Source: Learning Perl, chapter9,exercise-4
3 # Date: 2012-01-19
4 # Author: xiaodongrush
5 #-----------------------------------------------------------#
6 use 5.010;
7 $text = "## Copyright (C) 2012 by Yours Truly\n";
8 foreach(@ARGV) {
9 $files{$_} = 1;
10 }
11 while(<>) {
12 if(/## Copyright/) {
13 delete $files{$ARGV};
14 }
15 }
16 @ARGV = keys %files;
17 $^I = ".bak";
18 if(@ARGV != 0) {
19 while(<>) {
20 if(/#!/) {
21 $_ = $_ . $text;
22 }
23 print $_;
24 }
25 }
26 #-----------------------------------------------------------#
27 # 1. /i表示忽略大小写,/g表示全局匹配
28 # 2. $^I,在读入文件假设是word.txt,首先将其改名为word.txt.out,
29 # 然后创建一个空的word.txt文件,接着,word.txt.out的每一行,
30 # 并且通过print函数写入到word.txt文件中。
31 #-----------------------------------------------------------#
2 # Source: Learning Perl, chapter9,exercise-4
3 # Date: 2012-01-19
4 # Author: xiaodongrush
5 #-----------------------------------------------------------#
6 use 5.010;
7 $text = "## Copyright (C) 2012 by Yours Truly\n";
8 foreach(@ARGV) {
9 $files{$_} = 1;
10 }
11 while(<>) {
12 if(/## Copyright/) {
13 delete $files{$ARGV};
14 }
15 }
16 @ARGV = keys %files;
17 $^I = ".bak";
18 if(@ARGV != 0) {
19 while(<>) {
20 if(/#!/) {
21 $_ = $_ . $text;
22 }
23 print $_;
24 }
25 }
26 #-----------------------------------------------------------#
27 # 1. /i表示忽略大小写,/g表示全局匹配
28 # 2. $^I,在读入文件假设是word.txt,首先将其改名为word.txt.out,
29 # 然后创建一个空的word.txt文件,接着,word.txt.out的每一行,
30 # 并且通过print函数写入到word.txt文件中。
31 #-----------------------------------------------------------#
输出略,与前一题类似。
3. 文件