我有一个包含大量查询的.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文件的东西,我可以理解。
谢谢!
答案 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;
放在此脚本和未来脚本的顶部。