从文件中删除某些内容

时间:2012-02-04 23:57:28

标签: perl

如何在Perl中打开文件并删除某些内容? 目前我正在尝试删除电话号码和电子邮件。

我不知道从哪里开始,除了文件打开,所以我还没有共享任何代码。

4 个答案:

答案 0 :(得分:2)

您无法轻松删除文件的某些部分,然后重写该文件。通常,您必须从头开始重写文件。

这样一个简单的Perl程序:

use strict;
use warnings;
use autodie;

my $file_name = $ARG[0];

# Open file for reading and new for writing

open (my $read_fh, "<", $file_name);
open (my $write_fh, ">" "$file_name.temp");


# Read in line at a time, modify it, and write it

while (my $line = <$read_fh>) {

   # Modify the line some how to remove what you don't want

   $line =~ s/foo/bar/;

   print $write_fh $line;
}

close $read_fh;
close $write_fh;

# Delete the old file you read in and rename the new one

unlink $file_name;
rename "$file_name.temp" $file_name;

还有其他方法(使用<>运算符,打开文件进行读写,使用seek,一次将文件读入列表,使用map)但最后,它就是这样的:你读入文件,修改行,并将它们写入新文件。

答案 1 :(得分:0)

很大程度上取决于文件的格式。大多数Unix文件系统不提供删除文件中间信息的能力(我说最多,但我不知道有哪一个)。你最好的选择是不要使用平面文件。如果您需要执行此类操作,则需要使用某种形式的数据库。有很多不同类型的数据库,我确信你会做你想做的事。

最简单的数据库似乎符合您的需求(至少是添加和删除记录的能力)是DBM。在Perl 5中,您可以轻松地tie a DBM file到哈希变量,从而提供一种快速,简单,透明的与数据库交互的方式。

当然,您也可以使用关系数据库。关系数据库很不错,因为它们可以很容易地询问有关您存储的数据的各种问题并对这些查询采取行动。一个简单的入门方法是使用DBD::Sqlite模块(您还需要DBI模块)。这很简单,因为DBD :: Sqlite模块包含整个数据库引擎(在大多数数据库中,它是一个单独的,偶尔也很昂贵的服务器)。

答案 2 :(得分:0)

假设这是一个文本文件,我建议你Tie::File。从描述:

  

Tie :: File将常规文本文件表示为Perl数组。数组中的每个元素对应于文件中的记录。该文件的第一行是数组的元素0;第二行是元素1,依此类推。

您可以遍历数组以查找您想要的字符串,编辑并且您的文件将具有预期的更改。

答案 3 :(得分:0)

你可以在unix上尝试这样的东西:

cat file| perl -ne 'print unless (/IGNORE_PATTERN/)' >new_file