如何在Perl中读取多个文件并创建包含这些文件数据的不同文件

如何在Perl中读取多个文件并创建包含这些文件数据的不同文件,perl,Perl,我有一堆18MB的文本文件,我需要用Perl读取这些文件,提取特定的信息,并将其写入每个文件的新文件中 我该怎么做 例如,下面的代码仅适用于一个文件,并为代码中提到的文件创建一个新文件,但如何在多个文件上执行此操作,因为我有许多文件 下面是我的代码,它只在单个文件上工作。我想对很多文件也这样做。我怎么做 use Regexp::Common qw/net/; use Regexp::Common qw/net/; system("clear"); my $file2 = 'TR1'; ope

我有一堆18MB的文本文件,我需要用Perl读取这些文件,提取特定的信息,并将其写入每个文件的新文件中

我该怎么做

例如,下面的代码仅适用于一个文件,并为代码中提到的文件创建一个新文件,但如何在多个文件上执行此操作,因为我有许多文件

下面是我的代码,它只在单个文件上工作。我想对很多文件也这样做。我怎么做

use Regexp::Common qw/net/;
use Regexp::Common qw/net/;

system("clear");

my $file2 = 'TR1';
open my $in, '<', $file2 or die $!;
open my $out, '>', 'Number_of_Hops_TR1_007' or die $!;

my $var = 0;
my $i   = 0;
my $traceroute;
my $line;

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

    if ($line =~ /^traceroute to (\S+)/) {
        $traceroute = $1;
        $var++;

        #print "$traceroute\n";
    }
    my ($ip) = $line =~ /(?: \d+ \s \s+) ($RE{net}{IPv4}) /msx;

    if ($traceroute eq $ip) {

        print $out $ip if defined, "\n";
        if ($ip ne undef) {
            { $i++; }
        }
    }
    else {
    }
}

print $out "Number of traceroutes - $var\n";

print $out "Number of traceroutes reached destination - $i\n";

my $subs = $var - $i;

print $out
    "Number of traceroutes that did not reaach destination ($subs)\n";

my $perc = ($i / $var) * 100;

print $out "Percentage of sucessful traceroutes ($perc%)\n";
使用Regexp::Common qw/net/;
使用Regexp::Common qw/net/;
系统(“清除”);
my$file2='TR1';
打开我的$in、'Number\U Hops\U TR1\U 007'或die$!;
我的$var=0;
我的$i=0;
我的$traceroute;
我的美元线;
while(我的$line=){
如果($line=~/^traceroute to(\S+/){
$traceroute=$1;
$var++;
#打印“$traceroute\n”;
}
my($ip)=$line=~/(?:\d+\s\s+)($RE{net}{IPv4})/msx;
if($traceroute eq$ip){
如果定义了“\n”,则打印$out$ip;
如果($ip ne undef){
{$i++;}
}
}
否则{
}
}
打印$out“跟踪路由数-$var\n”;
打印$out“到达目标的跟踪路由数-$i\n”;
my$subs=$var-$i;
打印$out
“未重新到达目标的跟踪路由数($SUB)\n”;
my$perc=($i/$var)*100;
打印$out“成功跟踪路由的百分比($perc%)\n”;

一般方法可能如下所示:

#!/usr/bin/env perl
use strict;
use warnings;
my $prev = q();
my ($fh, $log);
while (<>) {
    if ( $ARGV ne $prev ) {
        $prev = $ARGV;
        $log  = $ARGV . '.log';
        open $fh, '>', $log or die "Can't open '$log': $!\n";
    }
    if ( m/^traceroute to (\S+)/ ) {
        print {$fh} $1, "\n";
    }
} continue {
    close $fh if eof;
}
#/usr/bin/env perl
严格使用;
使用警告;
我的$prev=q();
我的($fh,$log);
而(){
如果($ARGV ne$prev){
$prev=$ARGV;
$log=$ARGV'.log';
打开$fh,“>”,$log或die“无法打开$log:$!\n”;
}
如果(m/^traceroute到(\S+/){
打印{$fh}$1,“\n”;
}
}继续{
如果eof,则关闭$fh;
}

输出文件仅根据其输入名称后缀为“.log”命名。

一般方法如下:

#!/usr/bin/env perl
use strict;
use warnings;
my $prev = q();
my ($fh, $log);
while (<>) {
    if ( $ARGV ne $prev ) {
        $prev = $ARGV;
        $log  = $ARGV . '.log';
        open $fh, '>', $log or die "Can't open '$log': $!\n";
    }
    if ( m/^traceroute to (\S+)/ ) {
        print {$fh} $1, "\n";
    }
} continue {
    close $fh if eof;
}
#/usr/bin/env perl
严格使用;
使用警告;
我的$prev=q();
我的($fh,$log);
而(){
如果($ARGV ne$prev){
$prev=$ARGV;
$log=$ARGV'.log';
打开$fh,“>”,$log或die“无法打开$log:$!\n”;
}
如果(m/^traceroute到(\S+/){
打印{$fh}$1,“\n”;
}
}继续{
如果eof,则关闭$fh;
}

输出文件仅根据其后缀为“.log”的输入名称命名。

假设所有文件都在一个目录中(可能是“/home/user/tmp”),您可以将代码嵌入到一个由目录读取程序调用的函数“进程”中:

#!/usr/bin/perl -w

use strict;

my @files = </home/user/tmp/*>;

foreach (@files) {
  if (-f $_) {
    process ($_);
  }
}

sub process {
  my $file2 = $_[0];
  open my $in, '<', $file2 or die $!;
  open my $out, '>', "$file2.log" or die $!;

  # ... your remain code here
}
#/usr/bin/perl-w
严格使用;
我的@files=;
foreach(@files){
如果(-f$){
过程(元);;
}
}
子过程{
我的$file2=$\u0];
打开我的$in、“$file2.log”或die$!;
#…您的密码在这里
}
否则,您可以构建一个要编辑的文件列表(比如在“filelist.txt”中),其中包含完整的路径信息和每行一个文件名,并使用前面相同的代码加载到“@files”:

open LIST, "<filelist.txt" or die;
my @files = <LIST>;
close LIST;

openlist,“假设您在一个目录(可能是“/home/user/tmp”)中有所有文件,您可以将代码嵌入一个由目录读取程序调用的函数“进程”:

#!/usr/bin/perl -w

use strict;

my @files = </home/user/tmp/*>;

foreach (@files) {
  if (-f $_) {
    process ($_);
  }
}

sub process {
  my $file2 = $_[0];
  open my $in, '<', $file2 or die $!;
  open my $out, '>', "$file2.log" or die $!;

  # ... your remain code here
}
!/usr/bin/perl-w
严格使用;
我的@files=;
foreach(@files){
如果(-f$){
过程(元);;
}
}
子过程{
我的$file2=$\u0];
打开我的$in、“$file2.log”或die$!;
#…您的密码在这里
}
否则,您可以构建一个要编辑的文件列表(比如在“filelist.txt”中),其中包含完整的路径信息和每行一个文件名,并使用前面相同的代码加载到“@files”:

open LIST, "<filelist.txt" or die;
my @files = <LIST>;
close LIST;
打开列表,”

我没有那么多时间,所以我不能检查任何打字错误,希望你知道怎么做



我没有那么多时间,所以我无法检查任何打字错误,希望您了解如何操作。

我不确定这是否适合我的代码,请提供帮助,当我运行程序时,它只是继续运行如果脚本被调用
test.pl
,那么您将运行它,并将要解析的文件的名称作为其参数传递:
test.pl file1 file2 file3…
您的代码硬编码一个输入文件。我们的想法是将其改为处理多个文件的循环。我不确定这是否适合我的代码,请提供帮助,当我运行程序时,它只是继续运行如果脚本被调用
test.pl
,那么您将运行它,并将要解析的文件的名称作为其参数传递:
test.pl file1 file2 file3…
您的代码硬编码一个输入文件。我们的想法是将其改为一个处理多个文件的循环。抱歉,伙计们,但是我仍然很难将此代码与我自己的代码结合起来,特别是与文件名和allI一起使用打开读写文件的操作来更新代码。@Jamie实际上我尝试了上面的代码,但它不能正常工作我完全插入了我的代码从while循环开始到while循环结束。。。实际上什么都没有发生。。。我添加了下面的代码抱歉,伙计们,但是我仍然很难将这段代码与我自己的代码结合起来,特别是文件名和allI使用打开读写文件的操作来更新代码。@Jamie实际上我尝试了上面的代码,但它不能正常工作。我插入的代码完全是从while循环开始的,直到我的while循环结束了。。。实际上什么都没有发生。。。我添加以下代码请将其标记为答案或UpVot请将其标记为答案或UpVot请将其标记为答案或UpVot请将其标记为答案或UpVot请将其标记为答案或UpVot