Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何删除许多文件中的头行并使用Perl重命名它们_Perl - Fatal编程技术网

如何删除许多文件中的头行并使用Perl重命名它们

如何删除许多文件中的头行并使用Perl重命名它们,perl,Perl,我需要帮助处理许多小文件。我需要删除第一行(标题日期行),如果它存在,然后重命名文件q_dat\u 20110816.out=>q_dat\u 20110816.dat 我想出了如何打开文件,进行匹配并打印出需要删除的行 现在我需要弄清楚如何删除该行,然后完全重命名该文件 你将如何处理这个问题 测试代码: #!/usr/local/bin/perl use strict; use warnings; my $file = '/share/dev/dumps/q_dat_20110816.out

我需要帮助处理许多小文件。我需要删除第一行(标题日期行),如果它存在,然后重命名文件
q_dat\u 20110816.out
=>
q_dat\u 20110816.dat

我想出了如何打开文件,进行匹配并打印出需要删除的行

现在我需要弄清楚如何删除该行,然后完全重命名该文件

你将如何处理这个问题

测试代码:

#!/usr/local/bin/perl
use strict;
use warnings;

my $file = '/share/dev/dumps/q_dat_20110816.out';
$file = $ARGV[0] if (defined $ARGV[0]);

open DATA, "< $file" or die "Could not open '$file'\n";
while (my $line = <DATA>) {
        $count++;
        chomp($line);
        if ($line =~m/(Data for Process Q)/) {
                print "GOT THE DATE: --$line\n";
                exit;
        }
}
close DATA;
新文件:q_dat_20110816.dat

Make    Model   Text
a       b       c
d       e       f
g       h       i

这里有一种方法:

use strict;
use warnings;

my @old_file_names = @ARGV;

for my $f (@old_file_names){
    # Slurp up the lines.
    local @ARGV = ($f);
    my @lines = <>;

    # Drop the line you don't want.
    shift @lines if $lines[0] =~ /^Data for Process Q/;

    # Delete old file.
    unlink $f;

    # Write the new file.
    $f =~ s/\.out$/.dat/;
    open(my $h, '>', $f) or die "$f: $!";
    print $h @lines;
}
使用严格;
使用警告;
我的@old_file_name=@ARGV;
对于我的$f(@old_file_name){
#把台词弄乱。
本地@ARGV=(f美元);
我的@lines=;
#放下你不想要的电话线。
如果$lines[0]=~/^进程Q/的数据,则shift@lines;
#删除旧文件。
取消$f的链接;
#写入新文件。
$f=~s/\.out$/.dat/;
打开(我的$h,“>”,$f)或死亡“$f:$!”;
打印$h@行;
}

内存不足父子解决方案:

use strict;
use warnings;

for my $fni (@ARGV) {
    open(FI, '<', $fni) or die "cant open in '$fni', $!,";
    my $fno = $fni; $fno =~ s/\.out$/.dat/;
    open(FO, '>', $fno) or die "cant open out '$fno', $!,";
    foreach ( <FI> ) {
        print FO unless $. == 1 and /^Data for Process Q/;
    };
    close FO;
    close FI;
    unlink $fni;
};
使用严格;
使用警告;
我的$fni(@ARGV){
打开(FI),,$fno)或模具“无法打开'$fno',$!,”;
foreach(){
打印FO,除非$.==1和/^过程Q/的数据;
};
关闭FO;
密切关注金融机构;
取消$fni的链接;
};
这是未经测试的

use strict;
use warnings;

for my $fni (@ARGV) {
    open(FI, '<', $fni) or die "cant open in '$fni', $!,";
    my $fno = $fni; $fno =~ s/\.out$/.dat/;
    open(FO, '>', $fno) or die "cant open out '$fno', $!,";
    foreach ( <FI> ) {
        print FO unless $. == 1 and /^Data for Process Q/;
    };
    close FO;
    close FI;
    unlink $fni;
};