Есть дамп mysql'ной базы. Задача: вынуть оттуда данные.
Разворачивать этот дамп в базу категорически не хочется... Хотя бы потому что в проекте mysql не используется...
Парсить регулярными выражениями строки в которых заведомо внутри кавычек могут оказаться скобки, запятые и те же кавычки закранированные слэшами -- удовльствия мало.
Предполагаемое решение:
# my $str = "INSERT INTO `libbook` VALUES (1,'Aarh_Andrej_Aida',7162,'2007-06-20 13:24:00','Аида',0,0,'ru','fb2',0,'','','1.0','Mon Jun 10 21:40:30 2013'),(2,'Aarh_Andrej_Arlekino_i_P\\'ero',8066,'2007-06-20 13:24:01','Арлекино и Пьеро',0,0,'ru','fb2',0,'','','1.0','Mon Jun 10 21:40:30 2013');";
open F, 'lib.libbook.sql';
my $str;
while ($str =)
{
last if $str =~ /^INSERT INTO \`libbook\` VALUES \(/;
}
$str =~s/^INSERT INTO \`libbook\` VALUES \(/\=\(\[/; # Все начинается с "=(["
$str =~s/\)\,\(/\]\,\[/g; # Заменяем круглые скобки на квадратные
$str =~s/\)\;/\]\)\;/;
# Двойные кавычки экранировать не надо, ибо они в mysql уже заэкранированны.
$str =~s/(\d)\,\'/$1\,\"/g; # заменяем одинарные кавычки на двойные
$str =~s/\'\,(\d)/\"\,$1/g;
$str =~s/\'\,\'/\"\,\"/g;
$str =~s/\'\]/\"\]/g;
$str =~ s/([A-Za-z])/"\\x".unpack("H*",$1)/ge; # заменяем все латинские буквы на /x последовательности (типа защита от ijection)
$str = '@l'.$str; # добавляем в начало @l в которую все это будет присваиваться...
my @l=();
eval $str;
foreach (@l)
{
print $_->[0]," - ",$_->[1]," - \t", $_->[4],"\n";
}
Разворачивать этот дамп в базу категорически не хочется... Хотя бы потому что в проекте mysql не используется...
Парсить регулярными выражениями строки в которых заведомо внутри кавычек могут оказаться скобки, запятые и те же кавычки закранированные слэшами -- удовльствия мало.
Предполагаемое решение:
# my $str = "INSERT INTO `libbook` VALUES (1,'Aarh_Andrej_Aida',7162,'2007-06-20 13:24:00','Аида',0,0,'ru','fb2',0,'','','1.0','Mon Jun 10 21:40:30 2013'),(2,'Aarh_Andrej_Arlekino_i_P\\'ero',8066,'2007-06-20 13:24:01','Арлекино и Пьеро',0,0,'ru','fb2',0,'','','1.0','Mon Jun 10 21:40:30 2013');";
open F, 'lib.libbook.sql';
my $str;
while ($str =
{
last if $str =~ /^INSERT INTO \`libbook\` VALUES \(/;
}
$str =~s/^INSERT INTO \`libbook\` VALUES \(/\=\(\[/; # Все начинается с "=(["
$str =~s/\)\,\(/\]\,\[/g; # Заменяем круглые скобки на квадратные
$str =~s/\)\;/\]\)\;/;
# Двойные кавычки экранировать не надо, ибо они в mysql уже заэкранированны.
$str =~s/(\d)\,\'/$1\,\"/g; # заменяем одинарные кавычки на двойные
$str =~s/\'\,(\d)/\"\,$1/g;
$str =~s/\'\,\'/\"\,\"/g;
$str =~s/\'\]/\"\]/g;
$str =~ s/([A-Za-z])/"\\x".unpack("H*",$1)/ge; # заменяем все латинские буквы на /x последовательности (типа защита от ijection)
$str = '@l'.$str; # добавляем в начало @l в которую все это будет присваиваться...
my @l=();
eval $str;
foreach (@l)
{
print $_->[0]," - ",$_->[1]," - \t", $_->[4],"\n";
}