2013-04-11 3 views
-1

Ниже мой файл, который я отделяя от delimeneter и дальнейшей отправки по электронной почте список: DEVICE1 | Город | Улица | roadname | область | состояние | область | страна | CountryCodePerl в то время как цикл не работает

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

Благодаря

+3

Ваш вопрос действительно неясен. В вашем коде нет цикла while. – Cfreak

+0

Спасибо за ответ .. Я пробовал делать что-то вроде ниже, но он не работает ... $ Device = $ arr [0]; $ condition = "$ Device | Данные не найдены"; while (<>) { if ($ line = ~/$ condition /) { print $ condition; $ pattern = $ condition } } – user28104

+3

Пожалуйста, вернитесь и измените свой вопрос, включив в него весь код, а не только отдельные его части. Кроме того, ** что означает «не работает»? ** «Не работает» - это неадекватное описание для понимания проблемы. Что случилось, когда вы попробовали? Получили ли вы неправильные результаты? Вы получили * нет * результаты? Если результаты были неверными, что сделало их неправильными? Что вы ожидали вместо этого? Вы получили * любые * правильные результаты? Если да, то каковы они? Не заставляй нас гадать. –

ответ

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 является необязательным и имеет смысл только в том случае, если он положительный.

  • Вы устанавливаете $/ = '', предположительно, для полного удаления всего файла, но вы хотите обработать его по очереди.

+0

Спасибо за ответ Рик !!! Я скопировал ваш код, но, похоже, он не соответствует условию и в противном случае закроет мой $ INPUT, '<', '/tmp/list.txt' или die $ !; while (<$INPUT>) {my ($ device, $ data) = split (/ \ | /, $ _, 2); if ($ data eq 'Данные не найдены') {$ logger-> debug ("$ logid >> Данные не найдены: $ data"); } else { – user28104

+0

А - это, вероятно, из-за окончания строки. Я обновил код, чтобы удалить завершающий '/ n' с' chomp'. – RickF

Смежные вопросы