perl while循环不工作

kesse 发布于 2019-03-09 perl 最后更新 2019-03-09 14:37 6 浏览

下面是我的文件,我正在用delimeneter分开,并通过电子邮件进一步发送 列表:设备1 |城市|街道|道路名称|地区|州|地区|国家|国家代码

________________________________________________
Device1|City|Street|roadname|region|state|area|country|countrycode
Device2|City|Street|roadname|region|state|area|country|countrycode
Device3|No data found
Device4|No data found
_________________________________________________
my $filename = '/tmp/list.txt';
open my $ifh, '<', $filename
  or die "Cannot open '$file' for reading: $!";
local $/ = '';
my $filename = <$ifh>;
my @arr = split(/\|/, $filename , -1);
$Device = $arr[0];
$Region = $arr[2];
$State = $arr[3];
$area = $arr[10];
$country = $arr[19];
$logger->debug("$logid >> file information Device Name: $Device");
$logger->debug("$logid >> file information Region: $Region");
$logger->debug("$logid >> file information State: $State");
$logger->debug("$logid >> file information Area: $area");
$logger->debug("$logid >> file information Country: $country");
close( $ifh );
我能够得到以下信息,但我的要求是每当它显示“找不到数据”时,将其分配给变量,例如..“模式”,我将通过电子邮件进一步发送。
$smtp->datasend("$Device1|$region|$state|$area|$country\n");
$smtp->datasend("$pattern\n");
谢谢
已邀请:

lnon

赞同来自:

我想你想要的是这样的:

use strict;
use warnings;
open my $INPUT, '<', '/tmp/list.txt' or die $!;
while (<$INPUT>) {
    chomp;
    my ($device, $data) = split(/\|/, $_, 2);
    if ($data eq 'No data found') {
        # Do whatever you need to do when there is no data
    } else {
        my @values = split(/\|/, $data);
        my ($region, $state, $area) = @values[3,4,5];
        # Further processing as needed
    }
}
close $INPUT;
几点说明:
  • 始终是use strictuse warnings - 它会为您捕获许多问题。就像你两次声明my $filename一样。
  • split的第三个参数是可选的,只有在积极的情况下才有意义。
  • 您设置$/ = ''可能是为了立即整理整个文件,但您希望逐行处理。