Как удалить «AUTO_INCREMENT =» из моих входных документов sql? - PullRequest
0 голосов
/ 23 февраля 2012

Я новичок в 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 ]

2 голосов
/ 23 февраля 2012

Здесь много ошибок.Вы используете свои петли неправильно.Вы вызываете openFile для всего массива, один раз для каждого элемента в массиве.Вероятно, правильная версия:

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

Ваш саб построен неправильно.В perl вы не должны ставить аргументы в скобках после имени.Это место для прототипов (с которыми вы не хотите возиться).Ваши аргументы хранятся в неявной переменной @_.

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

Но это также неправильно, если вы собираетесь открыть только один файл.

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

Ваше открытое утверждение неверно,Когда вы помещаете массив в двойные кавычки, он интерполируется с пробелами между аргументами.Например,

@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

Возможно, вы не хотите возиться с двойным открытием чтения / записи.Здесь вы читаете до конца файла, затем добавляете данные в конец.Запишите данные во временный файл, а затем обменяйте их обратно.Или воспользуйтесь функцией редактирования на месте, но я бы не советовал вам это делать, поскольку вы не слишком опытны.Вы также можете 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;

Какэто поможет вам обнаружить ошибки и сэкономит много времени на отладку опечаток и других подобных неприятностей.

0 голосов
/ 23 февраля 2012

С лексическим дескриптором файла, картой и электронной записью ... работает.

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 ;
}

Редактировать: перемотка дескриптора файла

...