下面是解析配置文件、将检索到的数据写入另一个文件并将其发送到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);发布于 2016-08-31 18:36:02
每次打开要输出的文件时,都会创建一个新文件并删除任何先前存在的同名文件。这意味着您将只剩下您写入文件的最后一行
这里有一些更多的提示
use autodie来检查所有的IO操作,并且不需要手动测试返回状态die字符串,那么Perl会添加关于源文件名和行号的信息,这对于调试很有用
$_可以使程序变得更加简洁和可读性更好,这是许多内置操作符操作时,您应该使用占位符。这可能是危险的,这样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;发布于 2016-08-31 18:04:52
您需要将文本附加到创建新文件的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);也许这会对你有所帮助。
https://stackoverflow.com/questions/39246261
复制相似问题