perl - 如何在列表中拆分管道分隔的字符串?

标签 perl parsing

在工作中,我们正在开发一个我们的客户可以使用的通讯系统。作为一名实习生,我的工作之一是帮助解决较小的难题。在这种情况下,我需要做的是扫描电子邮件服务器的日志中是否有退回的邮件,并添加电子邮件以及电子邮件退回到“不良电子邮件数据库”的原因。

bad emails 表有两列:'email' 和 'reason'
我使用以下语句从日志中获取信息并将其发送到 Perl 脚本

grep " 550 " /var/log/exim/main.log | awk '{print $5 "|" $23 " " $24 " " $25 " " $26 " " $27 " " $28 " " $29 " " $30 " " $31 " " $32 " " $33}' | perl /devl/bademails/getbademails.pl

如果您对更高效的 awk 脚本有任何建议,那么我也很高兴听到这些建议,但我的主要关注点是 Perl 脚本。 awk 将“foo@bar.com|反弹原因”通过管道传送到 Perl 脚本。我想接收这些字符串,在 | 处拆分它们。并将这两个不同的部分放入数据库中各自的列中。这是我所拥有的:
#!usr/bin/perl                                                                                                                                                                               

use strict;
use warnings;
use DBI;

my $dbpath = "dbi:mysql:database=system;host=localhost:3306";
my $dbh = DBI->connect($dbpath, "root", "******")
    or die "Can't open database: $DBI::errstr";

while(<STDIN>) {
    my $line = $_;                                    
    my @list = # ?  this is where i am confused
    for (my($i) = 0; $i < 1; $i++)
    {
        if (defined($list[$i]))
        {
            my @val = split('|', $list[$i]);
            print "Email: $val[0]\n";
            print "Reason: $val[1]";
            my $sth = $dbh->prepare(qq{INSERT INTO bademails VALUES('$val[0]', '$val[1]')});
            $sth->execute();                                                                                                  
            $sth->finish();                                                                                                                                                                              
        }
    }
}
exit 0;

最佳答案

像这样的事情会起作用:

while(<STDIN>) {
  my $line = $_;
  chomp($line);
  my ($email,$reason) = split(/\|/, $line);
  print "Email: $email\n";
  print "Reason: $reason";
  my $sth = $dbh->prepare(qq{INSERT INTO bademails VALUES(?, ?)});
  $sth->execute($email, $reason);                                                                                                  
  $sth->finish();                                                                                                                                                                              
}

您可能会发现在 Perl 中完成整个事情更容易。 “下一个除非/550/”可以替换grep,正则表达式可能会替换awk。

关于perl - 如何在列表中拆分管道分隔的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/164865/

相关文章:

perl - 如何在 awk 或 shell 中实现这个?

regex - Perl 正则表达式 : how do I combine these 2 regex statements?

shell - 如何打印两个模式之间的行,包含或排除(在 sed、AWK 或 Perl 中)?

java - 格式化 Bean 生成器的 header 字段 - Java

java - JSON键是否需要唯一?

perl - 如何使用 ModPerl::Registry 抑制旧 CGI 脚本中的默认 mod_perl 错误页面

perl - 从 URL 列表中删除仅顶级目录的 URL?

java - 将表达式解析为其组件和子组件

c# - 加速解析算法

c++ - 如何使用正则表达式 C++ 将文本文件解析为变量?