我是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);
}
答案 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 ;
}
编辑:重绕文件句柄