2013-04-11 111 views
-1

下面是我的文件,我被delimeneter分隔條件,通過電子郵件將進一步發送 列表:Device1的|城|街| roadname |區域|狀態|區域|國家| COUNTRYCODEperl的while循環不工作

________________________________________________ 
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 2013-04-11 16:20:20

+0

感謝您的迴應..我已經嘗試做下面的東西,但它不工作... $設備= $ ARR [0]; $ condition =「$ Device | No data found」; (<>){ if($ line =〜/ $ condition /){ print $ condition; $ pattern = $ condition } } – user28104 2013-04-11 16:26:22

+3

請返回並修改您的問題以包含整個代碼,而不僅僅是選中的部分。另外,**「不起作用」是什麼意思?**「不起作用」是我們理解問題的不充分描述。當你嘗試時發生了什麼?你得到不正確的結果了嗎?你有沒有得到結果?如果結果不正確,是什麼使它們不正確?你想要什麼呢?你有沒有得到任何正確的結果?如果是這樣,他們是什麼?不要讓我們猜測。 – 2013-04-11 16:49:02

回答

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的第三個參數是可選的,只有在正值時纔有意義。

  • 您正在設置$/ = ''想要一口氣整個文件,但是您想要逐行處理它。

+0

感謝里克的迴應!我已經複製了你的代碼,但似乎它不符合條件,並進入其他循環打開我的$ INPUT,'<','/tmp/list.txt'或死亡$ !; while(<$INPUT>){my($ device,$ data)= split(/ \ | /,$ _,2); ($ data eq'No data found'){$ logger-> debug(「$ logid >>找不到數據:$ data」); }其他{ – user28104 2013-04-11 17:14:04

+0

啊 - 這可能是因爲行結束。我已經更新了代碼,用'chomp'去除尾隨'/ n'。 – RickF 2013-04-12 14:45:02