以下是我的文件,我正在通过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");
谢谢
答案 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 strict
和use warnings
- 它会为您捕获许多问题。就像你宣布my $filename
两次一样。
split
的第三个参数是可选的,只有在积极的情况下才有意义。
您设置$/ = ''
大概是为了一次性啜饮整个文件,但是您想逐行处理它。