|
文件: | 作业一报告.doc.zip |
大小: | 4KB |
下载: | 下载 |
|
第一次作业,要求是:找出一篇中文文本里所有的“因为……所以……”,输出时,包括这两个词旁边的部分内容,要求每对“因为”“所以”都对齐输出。
下面是代码,附件是报告。存在的问题在报告中提及。由于是比较早就完成的作业,这里就不去考究它了,新开的博客,顺便把以前的东西搁进来。
#!/usr/bin/perl
use strict;
use warnings;
#####################定义变量名##################
my $dir = "C:\\cause_so";
my $filename;
my $part_of_before="";
my @part_of_middle;
my $sentence="";
my $i;
my $line;
###################函数体#####################
open(FILE2,">C:\\cause_so.txt")or die "can not open this file $!";
opendir(DH,"$dir") || die "cannot open $dir: $!"; #开启文件目录操作
foreach $filename (grep(/\.txt$/i,readdir DH)) { #依次读入文件目录中每个文件的内容
open(FILE1,"$dir\\$filename") or die "can not open this file $!";
printf FILE2 "\n\n$filename:\n\n";
$line=0;
for($i=0;$i<20;$i++) {
$part_of_before=$part_of_before."."; #给每一句话前都加上20个字符".",避免匹配时错过某些符合要求的句子
}
while(<FILE1>) { #依次将每一段文本读入
$line++;
foreach $sentence (split/。|?|!|;/) { #以这几个符号把每个段落分开,存放到数组中。“因为”和“所以”的搭配得有意义
$sentence=$part_of_before.$sentence; #同第21行代码的解释
while ($sentence=~/(.{10})(因为)(.*)(所以)(.*)/g) { #匹配字符串
printf FILE2 "%4d=\t%s\t%s\t","$line", $1, $2; #下面的都是输出的控制,以达到对齐输出的效果
@part_of_middle=split('',$3);
if ($#part_of_middle > 29) { #这里的功能是,让$3所匹配的内容限定字符串长度打印输出,
printf FILE2 "%-24.24s","$3"; #如果其长度大于限定的长度,则用省略号代替多出来的字符
printf FILE2 "%6.6s",".........";
} else {
printf FILE2 "%-30s","$3";
}
printf FILE2 "\t$4\t$5 \n";
}
}
}
close(FILE1);
}
close(FILE2);
closedir(DH);
|
阅读(1090) | 评论(0) | 转发(0) |