perl while循环不工作

时间:2013-04-11 16:18:03

标签: perl

以下是我的文件,我正在通过delimeneter分离并通过电子邮件进一步发送 list:Device1 | City | Street | roadname | region | state | area | country | countrycode

________________________________________________
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 );

我能够得到以下信息,但我的要求是在显示“没有找到数据”的行中,将其分配给变量,例如..“pattern”,我将通过电子邮件进一步发送。

$smtp->datasend("$Device1|$region|$state|$area|$country\n");
$smtp->datasend("$pattern\n");

谢谢

1 个答案:

答案 0 :(得分:1)

我认为你想要的是这样的:

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的第三个参数是可选的,只有在积极的情况下才有意义。

  • 您设置$/ = ''大概是为了一次性啜饮整个文件,但是您想逐行处理它。