用于在用户输入中搜索和替换.SQL查询文件的Perl脚本

时间:2010-06-01 20:40:47

标签: mysql perl

我有一个包含大量查询的.SQL文件。它们针对包含多年多个状态的数据的数据库运行。我运行它的机器只能在一年内处理一个状态的查询。

我正在尝试创建一个Perl脚本,该脚本接受用户输入的状态缩写,状态ID号和年份。然后它为该州和年创建一个目录。然后它打开“base”.SQL文件并搜索并用用户输入替换基本状态id和year,并将这个新的.SQL文件保存到创建的目录中。

我当前的脚本(下面)停在

open(IN,'<$infile')

"Can't open [filename]"

似乎很难找到或打开.SQL文件。我进行了四重检查,以确保路径正确,我甚至尝试更换

$path

使用基本文件的绝对路径。如果它在创建新文件时遇到问题,我会有更多方向,但由于无法找到/打开基本文件,我不知道如何继续。

 #!/usr/local/bin/perl

use Cwd;
$path = getcwd();
#Cleans up the path
$path =~ s/\\/\//sg;

#User inputs
print "What is the 2 letter state abbreviation for the state? Ex. 'GA'\n";
$stlet = <>;
print "What is the 2 digit state abbreviation for the state? Ex. '13'\n";
$stdig = <>;
print "What four-digit year are you doing the calculations for? Ex. '2008'\n";
$year = <>;

chomp $stlet;
chomp $stdig;
chomp $year;

#Creates the directory
mkdir($stlet);
$new = $path."\/".$stlet;
mkdir("$new/$year");

$infile = '$path/Base/TABLE_1-26.sql';
$outfile = '$path/$stlet/$year/TABLE_1-26.sql';

open(IN,'<$infile') or die "Can't open $infile: $!\n";
open(OUT,">$infile2") or die "Can't open $outfile: $!\n";
print "Working...";

while (my $search = <IN>) {
chomp $search;
$search =~ s/WHERE pop.grp  = 132008/WHERE pop.grp  = $stdig$year/g;

print OUT "$search\n";  
}
close(IN);

close(OUT);

我知道我也可能需要调整一些正则表达式,但我想尝试一次一个。这是我的第一个Perl脚本,我真的无法找到任何处理.SQL文件的东西,我可以理解。

谢谢!

1 个答案:

答案 0 :(得分:2)

$infile = '$path/Base/TABLE_1-26.sql';

该行中的字符串是单引号,因此$path不会进行插值,因此您的程序正在查找名为$path/Base/TABLE_1-26.sql的文件。

你想要

$infile = "$path/Base/TABLE_1-26.sql";

或者,更好,

use File::Spec;
....
$infile = File::Spec->catfile($path, 'Base', 'TABLE_1-26.sql');

$outfile类似,或者是$infile2? :)我强烈建议将use strict;use warnings;放在此脚本和未来脚本的顶部。