如何从输入的sql文件中删除“AUTO_INCREMENT =”?

时间:2012-02-23 18:36:11

标签: perl file-io substitution

我是Perl的新手,所以我的语法可能会关闭。我一直在阅读其他问题,但仍然没有得到它的工作。

问题与该行有关:

@fileinput =~s/AUTO_INCREMENT=//d;

如果你能给我一些指导,让它发挥作用,那就太好了。

这是我到目前为止的代码:

@file_names = ("eV12_No_Data.sql", "V12_No_Data.sql");

foreach(@file_names)
{
    openFile(@file_names);
}

sub openFile(@names)
{
    open(FILE, "+<@names");
    my @fileinput = <FILE>;
    foreach (@fileinput){
        @fileinput =~s/AUTO_INCREMENT=//d;
    }
    print FILE @fileinput;
    close(FILE);
}

2 个答案:

答案 0 :(得分:2)

这里有很多错误。您错误地使用了循环。您正在为整个数组调用openFile,每个元素在数组中调用一次。正确的版本可能是:

foreach (@file_names) {
    openFile($_);
}

您的子版构建错误。在perl中,您不会在子名称后面的parens中放置参数。这个空间用于原型(你不想搞砸)。您的参数存储在隐式变量@_中。

sub openFile {
    my @names = @_;  # args are stored in @_

但如果您打算只打开一个文件,这也是错误的。

my $file = shift;  # shift an argument from @_

您的公开声明不正确。当您将数组放在双引号中时,会在参数之间插入空格进行插值。 E.g。

@array = ("file.txt", "file2.txt");
print "@array"; # prints "file.txt file2.txt"

您不检查open语句的返回值,这意味着它可以无提示失败(在这种情况下可能会这样做)。使用:

open my $fh, "<", $file or die $!; # three arg open with lexical file handle

你可能不想乱用trixy读/写双打开。你在这里做的是读到文件的末尾,然后将数据附加到最后。将数据写入临时文件,然后将其交换回来。或者使用inplace-edit,但我不建议你,因为你似乎没有经验。您也可以seek到文件的开头,但是我不会这样做,因为重新打开文件也很简单。

这种说法也是错误的。

@fileinput =~s/AUTO_INCREMENT=//d;

它会将您的数组置于标量上下文中,这将转换为您尝试对数字执行替换。另外,据我所知,没有/d修饰符。

只需删除数组,然后使用

s/AUTO_INCREMENT=//;

...来代替。这相当于$_ =~ s/...。当没有给出显式变量时,$_是perl使用的默认变量。

但为什么要自己努力呢?只需使用单行:

perl -i.bak -pwe 's/AUTO_INCREMENT=//g' eV12_No_Data.sql V12_No_Data.sql

这将保存带有“.bak”扩展名的文件的备份副本,并使用-p开关循环遍历文件,每行执行多次替换(因为/g修饰符,将其删除以仅删除第一个匹配项。)

编写perl代码时,记住使用

始终非常重要
use strict;
use warnings;

因为它可以帮助你发现错误,并节省你很多时间调试错别字和其他麻烦。

答案 1 :(得分:0)

使用lexical filehandle,map和e voila ...可以工作。

use strict ;
use warnings ;

my @file_names = ("eV12_No_Data.sql", "V12_No_Data.sql");

foreach my $file ( @file_names ) {
    open my $filehandle , '+<' , $file or die "Cannot read/write $file" ;
    my @content = map { s/AUTO_INCREMENT=// ; $_ } <$filehandle> ;
    seek $filehandle, 0, 0 ;
    print $filehandle @content ;
    close $filehandle ;
}

编辑:重绕文件句柄