这是我的代码,用于解析配置文件,将检索到的数据写入另一个文件并将其发送到MySQL数据库。
数据库连接和向表中写入数据工作正常,但是我无法将数据写入上述文件mongoData.txt
。
我对Perl很陌生,所以任何帮助都会受到高度赞赏。
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
my $line;
# Retrieving data
open( my $FILE, "<", "/etc/mongod.conf" )
or die "Cannot find file! : $!\n";
while ( $line = <$FILE> ) {
chomp($line);
my ( $KEY, $VALUE ) = split /\:/, $line;
# Ignoring commented lines
$_ = $line;
unless ( $_ = ~/^#/ ) {
# Write to file
open my $FILE2, ">", "/home/sierra/Documents/mongoData.txt"
or die "Cannot create file $!\n";
print $FILE2 "$KEY", "$VALUE\n";
}
# Connection to SQL database
my $db = DBI->connect(( "dbi:mysql:dbname=mongodconf;
host = localhost;", "root", "sqladmin"
)) or die "can't connect to mysql";
# Inserting into database
$db->do("insert into data values ('$KEY', '$VALUE')")
or die "query error\n";
}
close($FILE);
答案 0 :(得分:4)
每次打开文件进行输出时,都会创建一个新文件并删除任何具有相同名称的预先存在的文件。这意味着您将只留下您写入文件的 last 行
这里有更多指针
变量标识符通常应全部为数字,小写字母和下划线。大写字母保留用于全局标识符,例如包名称
如果您运行的是早于v5.14的Perl版本,那么您可以use autodie
为您检查所有IO操作,并且无需手动测试返回状态
如果您使用最后没有换行符的die
字符串,那么Perl将添加有关源文件名和行号的信息,这对调试很有用
没有必要为循环控制变量命名。使用Perl的代词变量$_
可以使程序更加简洁和可读,这是许多内置运算符的默认值
每次需要进行更改时重新连接到数据库都是浪费。您应该在程序顶部连接一次并在整个代码中使用该静态连接
将参数表达式传递给SQL操作时,应使用占位符。它可能很危险,DBI
会正确引用它们
无需显式关闭输入文件。一切都将在程序结束时自动关闭。但是如果您担心输出数据的完整性,您可能希望对输出文件句柄执行显式close
,以便检查它们是否成功
这是我要写的。它不是测试输入的每一行是否以散列开头,而是从第一个散列字符开始删除所有内容,然后检查剩下的是否有任何非空白字符。这允许在数据中追踪评论
#!/usr/bin/perl
use strict;
use warnings 'all';
use autodie;
use DBI;
my ($input, $output, $dsn) = qw{
/etc/mongod.conf
/home/sierra/Documents/mongoData.txt
dbi:mysql:dbname=mongodconf;host=localhost;
};
open my $fh, '<', $input;
open my $out_fh, '>', $output;
my $dbh = DBI->connect($dsn, qw/ root sqladmin /)
or die "Can't connect to MySQL: $DBI::errstr";
while ( <$fh> ) {
chomp;
s/#.*//;
next unless /\S/;
my ( $key, $val ) = split /\:/;
print $out_fh "$key $val\n";
$dbh->do('insert into data values (?, ?)', $key, $val);
}
close $out_fh or die $!;
$dbh->disconnect or warn $dbh->errstr;
答案 1 :(得分:0)
您需要将文本附加到创建新文件mongoData.txt
while ($line=<$FILE>)
{
chomp ($line);
my ($KEY, $VALUE) = split /\:/,$line;
# Ignoring commented lines
$_ = $line;
unless ($_ = ~/^#/)
{
open my $FILE2, ">>", "/home/sierra/Documents/mongoData.txt" or die "Cannot create file $!\n";
print $FILE2 "$KEY","$VALUE\n";
}
}
close($FILE2);
或者
在嵌套while循环之前创建一次文本文件
open my $FILE2, ">", "/home/sierra/Documents/mongoData.txt"
or die "Cannot create file $!\n";
while ($line=<$FILE>)
{
chomp ($line);
my ($KEY, $VALUE) = split /\:/,$line;
# Ignoring commented lines
$_ = $line;
unless ($_ = ~/^#/)
{
print $FILE2 "$KEY","$VALUE\n";
}
}
close($FILE2);
可能会对你有帮助。