perl将变量写入文件

时间:2016-08-31 09:49:41

标签: perl variables

这是我的代码,用于解析配置文件,将检索到的数据写入另一个文件并将其发送到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);

2 个答案:

答案 0 :(得分:4)

每次打开文件进行输出时,都会创建一个新文件并删除任何具有相同名称的预先存在的文件。这意味着您将只留下您写入文件的 last

这里有更多指针

  • 变量标识符通常应全部为数字,小写字母和下划线。大写字母保留用于全局标识符,例如包名称

  • 如果您运行的是早于v5.14的Perl版本,那么您可以use autodie为您检查所有IO操作,并且无需手动测试返回状态

    < / LI>
  • 如果您使用最后没有换行符的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);

可能会对你有帮助。