`
happmaoo
  • 浏览: 4547529 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

perl处理文本经验积累(不断更新中)

阅读更多

1. 把同根路径不同文件包中同名的文件合并

例子:

作用描述: 问题:
现有五个目录分别存放5个领域的文件
F:\...\fold\canyin\sys
F:\...\fold\jiaotong\sys
F:\...\fold\lvyou\sys
F:\...\fold\shangwu\sys
F:\...\fold\tiyu\sys

而每个
F:\...\fold\xxx\sys目录
下面有
18个文件:
text(0).txt
text(1).txt
....
text(16).txt
text(17).txt

想把五个领域目录下的文件名相同的文件合并成一个文件

比如:
all_text(0).txt=
(F:\...\fold\canyin\sys\text(0).txt)
+(F:\...\fold\jiaotong\sys\text(0).txt)
+(F:\...\fold\lvyou\sys\text(0).txt)
+(F:\...\fold\shangwu\sys\text(0).txt)
+(F:\...\fold\tiyu\sys\text(0).txt)
这里的'+'表示文件合并的意思
即后面处于不同目录下面的五个同名文件将被合并到all_text(0).txt文件中

#!
@person=qw(canyin jiaotong lvyou shangwu tiyu);
for($i=0;$i<18;$i++) {
$src=join('+',map{$_."\\sys\\test_part_result_by_index($i).txt"} @person);
print $src ,"\n";
system("copy $src fold1_all_text($i).txt");
}

2. 简易获取当前目录下所有文件名

一般是用CWD模块,下面这个更简洁

#!
#####
#给目录下面的文件改名字
while($file=glob('*.txt')) {#glob 取得当前目录下的文件名
print "$file\n";
$newfile = "canyin_".$file;
rename($file,$newfile);
print "$newfile\n";
}

3. 去除文件每行前标号

在EBMT翻译时,为防止串行一般在每行前加标号,格式如:[0001234]

在评测前,需要去掉之,代码如下: 写成批处理即可运行。

#!
$inputfile =shift ;
$outputfile = shift;
open IN,"<$inputfile" or die "can not open file : $inputfile\n";
open OUT,">$outputfile" or die "can not open file : $outputfile\n";
foreach $str (<IN>){

$str =~s/^\[( \d+ )\]//g;#去掉行首[ 12121212 ]
$str =~s/^ //g;#去掉行首空格
print OUT $str;
}

4. 从评测结果文件中提取结果:

#!

$inputfile = shift;

$outputfile = shift;
open IN ,$inputfile or die "can not open file,$!\n ";
open OUT, ">$outputfile" or die"can not open >out.txt,$!\n";

my $contents = <IN>;
my @system_names;
$sys = "system name= \"";
$nist5 = "Nist5Score=\"";
$bleu5 = "Bleu5Score=\"";
my @nist5score;
my @nist3score;
my @nist1score;
my @bleu5score;
my @bleu3score;
my @bleu3score;
#@system_names = /$sys(.*?)\"/g;
$sys ="<system name=\"";

@system_names=($contents=~/$sys(.*?)\"/gs);
@nist5score = ($contents=~/$nist5(.*?)\"/gs);
@bleu5score = ($contents=~/$bleu5(.*?)\"/gs);
print OUT join("\n",@system_names);
print OUT "\nnist5\n";
print OUT join("\n",@nist5score);
print OUT "\nbleu5\n";
print OUT join("\n",@bleu5score);
5。把文件随机化

#!/usr/bin/perl
#功能: 把输入文件随机化(每行是一个单位)
#方法:每次产生一个在总行数之间的随机整数,用一个标记数组看有是否已经输出。

use strict;
my $n = 100;
my $seed = 1;
#Do not call srand() (i.e. without an argument) more than once in
#a script. The internal state of the random number generator
#should contain more entropy than can be provided by any seed, so
#calling srand() again actually *loses* randomness.

my $infile = shift;
my $outfile = shift;
open(IN,$infile) || die "无法打开input.txt\n";
open (OUT,">$outfile")|| die "无法打开output.txt\n";

my @all = <IN>;
my $sen_num = @all;#总句子数
my $cur_num = 0;#目前提取的句数
my @lab ;#标记数组
my $selected = 100;
my $non_selected = 0;

srand();

#先把标记数组初始化
my $i=0;
for($i=0;$i<@all;$i++)
{
$lab[$i] = $non_selected;
}

my $num = 0;
while($cur_num < $sen_num)
{
$num = int rand($sen_num);

if($lab[$num] != $selected)
{
print OUT @all[$num];

$lab[$num] = $selected;
$cur_num ++;
#$num ++;
}
}

6. 上面的随机做法效率很低,建议用下面这个很棒的shuffle做法。

#!
use List::Util 'shuffle';
@all = <STDIN>;
$num = @all;
@list = (0..$num-1);
@shuffled = shuffle(@list);
foreach $i(@shuffled){
print $all[$i];
}



7. 文件成行读入
把一个文件读入一个字符串
方法:
my $contents;
{
local $/;
$contents = <IN>;
}

my $contents = do {local $/; <IN>}
例子: 文件中以空行为语块分割的标记,把语块内部顺序保留,而语块间逆序输出。
#!
open IN,"input.txt";
open OUT,">output.txt";
my $contents;
{
local $/;
$contents = <IN>;
}
my @all = split("\n\n",$contents);#不同文件格式也可能是my @all = split("\n\r\n",$contents);
for(my $i=@all-1;$i>=0;$i--)
{
print OUT $all[$i],"\n\n";
}
close(IN);
close(OUT);

8. 如何用foreach每次读取多句?
那就用<FH>读三次,
while (!eof(FH)){
$line1 = <FH>;
$line2 = <FH>;
$line3 = <FH>;
...
}


9 (非)贪婪(non-greedy)匹配

? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,
匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,
而默认的贪婪模式则尽可能多的匹配所搜索的字符串。
例如,对于字符串 "oooo",’o+?’ 将匹配单个"o",而 ’o+’ 将匹配所有 ’o’。

如果你使用一个旧的Perl版本, 并且你不想贪婪匹配, 你必须使用否定的字符类。(真的, 你正在得到一种限制的贪婪匹配)

在Perl的现在版本中, 你能通过在数量词后使用一个问号,
强迫进行非贪婪的最小匹配。 
同样的用户名匹配将是/.*?:/。现在这个.*?将尽可能匹配少的字符, 而不是尽可能多的字符,
所以它停在第一个冒号而不是最后一个冒号。

例子:
问题是这样的:
比如给一句话,形式如下:
I(i)/xx came(come)/xx ,(,)/xx ((()/xx {({)/xx how it like(how it like)/yy
解释格式:
词组,然后是用小括号包围的词组还原形式,然后是斜杠'/',然后是词性..

要求: 把还原形式去掉
例如上句想得到:
I/xx came/xx ,/xx (/xx {/xx how it like/yy

难点: 1. 词组可能是左小括号'(' 即可能有词组: ((()/xx
2. 各种标点,括号() [] {}等
3. 好几个词的词组,如: How it like(how it like)/xx

做法: 拆分成一段一段来做吧,要不然用regexp处理各段之间的混淆很麻烦:

my $str="I(i)/xx came(come)/xx ,(,)/xx ((()/xx )())/x {({)/xx how it like(how it like)/yy";
my $res='';
while($str=~m|(.*?/\S+)|g) {# 非贪婪匹配,否则结果就是 I/yy
my $token=$1;
$token=~s|\(\(\(\)|\(|g;
$token=~s|\)\(\)\)|\)|g;
$token=~s|\(.*\)||g;
$res.=$token;
}
print $res,"\n";

分享到:
评论

相关推荐

    perl常用知识_perl常用知识

    Perl在处理文本操作、系统管理任务、网络编程、数据库接口等方面表现出色,因此在IT领域中有着广泛的应用。以下是一些关于Perl常用知识的详细解释: 1. **变量与数据类型**: - Perl支持多种数据类型,包括标量...

    Perl 5教程及perl常问问题集

    Perl 5 是一种功能强大的文本处理语言,广泛用于系统管理、网络编程、脚本编写以及Web开发等场景。它的语法独特,结合了C、sed、awk等语言的特点,被誉为“实用...在实践中不断探索和积累,你将成为Perl编程的专家。

    Effective.Perl

    1. **强大的文本处理能力**:Perl被认为是迄今为止最好的文本处理语言之一,它内置了强大的字符串操作和正则表达式支持,使得处理文本数据变得异常简单。 2. **高效的脚本工具**:对于Unix系统管理员而言,Perl是一...

    Perl编程24学时教程

    学习文件句柄和缓冲的概念,以及如何使用Perl处理大型数据文件。 5. **模块和CPAN**:Perl拥有丰富的模块库CPAN(Comprehensive Perl Archive Network)。学习如何查找、安装和使用CPAN模块以扩展Perl的功能。 6. ...

    perl入门必看很容易懂

    对于希望快速进行文本处理、自动化任务以及数据处理的开发者来说,掌握Perl是非常有益的。 #### 二、反向引用(Backtracking) 在正则表达式中,反向引用(Backtracking)是一个重要的概念,用于引用之前捕获的子...

    正则表达式PPT示例讲解

    总的来说,正则表达式是IT人员必备的技能之一,虽然初次接触可能感到困惑,但随着使用经验的积累,它们将成为你处理文本问题的得力工具。通过不断的学习和实践,我们可以掌握这个强大的工具,提升我们的编程效率和...

    Best Linux Books

    对于Linux的学习和提高,除了在实践中不断积累经验外,阅读专业的书籍也是一个很好的方式。博文链接推荐了一本专注于Perl正则表达式的快速参考指南。虽然本文内容围绕Perl语言的正则表达式展开,但是考虑到其重要性...

    正则表达式百度版

    通过不断地实践和积累经验,开发者可以更加熟练地运用正则表达式解决实际问题,提高工作效率。 总之,正则表达式是计算机科学领域中一项重要的技能,无论是在日常的文本处理工作中,还是在更深入的数据分析和开发...

    脚本(有题目和答案)

    在IT行业中,脚本语言是不可或缺的一部分,它们广泛应用于自动化任务、系统管理、网页开发以及软件测试等多个领域...同时,实践是检验真理的唯一标准,多动手编写脚本,不断积累经验,将使你在IT行业的竞争中更具优势。

    Infobot - Original Perl IRC Infobot-开源

    此外,Infobot还可以通过学习和积累新的信息来不断更新其知识库,从而提高其回应的准确性和全面性。 Perl是一种灵活且功能丰富的脚本语言,特别适合处理文本和网络数据。在Infobot的实现中,Perl的这些特性得以充分...

    很全的正则表达式

    正则表达式(Regular Expression,简称regex)...学习正则表达式,需要熟悉其基本语法,理解各种元字符和构造的含义,并通过实践不断积累经验。通过不断练习和使用,你将能够熟练运用正则表达式解决各种文本处理问题。

    很好的正则表达式学习资料

    正则表达式(Regular Expression,简称regex)是用于在文本中匹配特定模式的强大工具,它在编程、数据处理和文本分析等领域中起着至关重要的作用。正则表达式由普通字符(例如字母、数字)以及特殊字符(称为元字符...

    正则表达式-随心查找随心所用

    正则表达式是一种强大的文本处理工具,用于模式匹配和替换。它在各种编程语言和操作系统...这需要时间和经验的积累,但一旦熟练掌握,正则表达式将成为你不可或缺的工具,无论是在文本处理、数据分析还是在网页开发中。

    21天PHPppt.rar

    《21天PHPppt》是针对初学者设计的一份压缩包资源,旨在帮助你快速掌握PHP编程语言,了解其核心概念和...在21天的学习过程中,不断积累经验,相信你将能够独立构建简单的PHP网站,为进一步深入学习和应用打下坚实基础。

    正则学习资料

    总的来说,学习正则表达式需要时间和耐心,但一旦掌握了这一技能,你会发现它在处理文本数据时的无比强大。通过实例教程、入门指南和系统教程的综合学习,你可以逐步成为一名熟练的正则表达式使用者。在实践中不断...

    十天学会PHP教程(CHM)

    PHP(Hypertext Preprocessor,...总的来说,“十天学会PHP教程”可能涵盖了以上提到的一些基础知识,但真正精通PHP需要时间和实践经验的积累。希望这个概述能为你提供一个全面的学习指南,并激发你深入探索PHP世界。

    phper11.rar

    PHP,全称“Hypertext Preprocessor”,即“超文本预处理器”,是一种广泛应用于互联网的开源...无论你是初涉PHP的新手,还是寻求提升的老兵,都应保持持续学习的热情,不断更新知识,以适应快速变化的Web开发环境。

Global site tag (gtag.js) - Google Analytics