首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >perl将变量写入文件

perl将变量写入文件
EN

Stack Overflow用户
提问于 2016-08-31 17:49:41
回答 2查看 417关注 0票数 0

下面是解析配置文件、将检索到的数据写入另一个文件并将其发送到MySQL数据库的代码。

数据库连接和将数据写入到表中工作正常,但是我无法让它将数据写入到前面提到的文件mongoData.txt中。

我是Perl的新手,所以如果有任何帮助,我将不胜感激。

代码语言:javascript
复制
#!/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);
EN

回答 2

Stack Overflow用户

发布于 2016-08-31 18:36:02

每次打开要输出的文件时,都会创建一个新文件并删除任何先前存在的同名文件。这意味着您将只剩下您写入文件的最后一行

这里有一些更多的提示

  • 变量标识符通常应全部为数字、小写字母和下划线。如果你运行的是v5.14以后的Perl版本,那么你可以使用use autodie来检查所有的IO操作,并且不需要手动测试返回状态
  • 如果你使用一个末尾没有换行符的die字符串,那么Perl会添加关于源文件名和行号的信息,这对于调试

很有用

  • 不需要命名你的循环控制变量。通过使用Perl的代词变量$_可以使程序变得更加简洁和可读性更好,这是许多内置操作符
  • 的默认设置。每次需要更改时,重新连接到数据库都是浪费的。您应该在程序的顶部连接一次,并在整个代码中使用该静态连接。在将参数表达式传递给

操作时,您应该使用占位符。这可能是危险的,这样DBI将为您正确地引用它们,

  • 不需要显式关闭输入文件。所有内容都将在程序结束时自动关闭。但是,如果您担心输出数据的完整性,则可能需要对输出文件句柄执行显式close,以便检查它们是否继承了

这就是我要写的。它不是测试输入的每一行是否都以散列开头,而是删除从第一个散列字符开始的所有内容,然后检查剩余的内容中是否有任何非空白字符。这允许在数据中添加尾随注释。

代码语言:javascript
复制
#!/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;
票数 4
EN

Stack Overflow用户

发布于 2016-08-31 18:04:52

您需要将文本附加到创建新文件的mongoData.txt

代码语言:javascript
复制
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循环之前创建一次文本文件

代码语言:javascript
复制
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);

也许这会对你有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39246261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档