2016-03-21 52 views
0

背景:使用字符串EQ未初始化值的27

我不是一個PERL專家,但在遷移一些腳本到新的服務器使用Perl的新版本和PHP所有的工作其他人工作,但這個特定的一個不工作。

我已經安裝了這個腳本依賴運行的所有模塊,並且這些PM相關的錯誤已經停止。

環境:

  • Web服務器運行
  • 的Ubuntu 12.04 LTS 64位
  • 的Apache 2
  • Mysql的
  • PHP5
  • freetds的
  • 所有防火牆許可,遠程數據庫連接 測試和驗證
  • 所有必需的Perl模塊和Apache/PHP5 擴展測試和驗證

腳本功能:

腳本是爲了從RSS拉故事,並把它們到遠程數據庫。

問題:

在腳本這個新的服務器我得到下面的錯誤上沒有問題,運行舊的服務器:

Use of uninitialized value in string eq at ./parse_rss.pl line 27.

第27行是這樣的:

if (ref($item->{'company:symbol'} eq 'ARRAY')) { 
       next; 

請在下面查看完整的腳本:

#!/usr/bin/perl 
# 

use warnings; 
use strict; 
use DateTime; 
use DateTime::Format::ISO8601; 
use XML::FeedPP; 

my $starttime; 
if ($#ARGV == -1) { 
     $starttime = DateTime::Format::ISO8601->parse_datetime("1970-01-01T00:00:00"); 
} 
else { 
     $starttime = DateTime::Format::ISO8601->parse_datetime($ARGV[0]); 
} 

my $feed = XML::FeedPP->new("http://RSS.FEED.URL"); 
my $num_items = $feed->get_item(); 
for (my $i = $num_items - 1; $i >= 0; $i--) 
{ 
     my $item = $feed->get_item($i); 
     my $dt = DateTime::Format::ISO8601->parse_datetime($item->pubDate); 
     if ($dt < $starttime) { 
       last; 
     } 
     if (ref($item->{'company:symbol'} eq 'ARRAY')) { 
       next; 
     } 
     if ($item->title =~ /(.+?) (upgraded|downgraded) to (.+?) from (.+?) at (.+)/) { 
       print sprintf("%04d-%02d-%02d %02d:%02d:%02d", $dt->year(), $dt->month(), $dt->day(), $dt->hour(), $dt->minute(), $dt->second()) . "|$1|" . $item->{'company:symbol'} . "|$2|$3|$4|$5\n"; 
     } 
     elsif ($item->title =~ /(.+?) (initiated) with (\w+) (.+?) at (.+)/) { 
       print sprintf("%04d-%02d-%02d %02d:%02d:%02d", $dt->year(), $dt->month(), $dt->day(), $dt->hour(), $dt->minute(), $dt->second()) . "|$1|" . $item->{'company:symbol'} . "|$2|$4|...None...|$5\n"; 
     } 
} 

任何幫助,將不勝感激

+0

什麼是'$項的值'?您可以使用['Data :: Dumper'](https://metacpan.org/pod/Data::Dumper)輕鬆打印散列 –

+3

這些括號肯定是錯誤的。 'ref($ foo eq「bar」)'將始終返回一個空字符串,因爲'eq'的結果永遠不會是引用。 – ThisSuitIsBlackNot

回答

0

你的括號是在錯誤的地方

if (ref($item->{'company:symbol'} eq 'ARRAY')) { 

應該

if (ref($item->{'company:symbol'}) eq 'ARRAY') { 

ref返回一個字符串,這在陣列的情況恰好是ARRAY。因此,這將檢查該散列元素中的引用是否是數組引用。

0

由於TLP says,問題是你的線

if (ref($item->{'company:symbol'} eq 'ARRAY')) 

表達$item->{'company:symbol'} eq 'ARRAY'計算結果爲真正 -1或空字符串和ref運算符返回false,空字符串 - 在這兩種情況下,因爲既不是參考

您的意思是檢查散列元素是否是數組引用,所以

if (ref $item->{'company:symbol'} eq 'ARRAY') 

沒有括號都將將罰款

有一些與你的代碼的其他問題。具體來說,我認爲在循環開始時提取迭代值的函數是更合適的。

所以,舉例來說

if (ref($item->{'company:symbol'} eq 'ARRAY')) { 
    next; 
} 

更清晰寫成

my $company_symbol = $item->{'company:symbol'}; 

next if ref $company_symbol eq 'ARRAY'; 

這是你的代碼的版本,您可能更喜歡

#!/usr/bin/perl 

use warnings; 
use strict; 

use DateTime; 
use DateTime::Format::ISO8601; 
use XML::FeedPP; 

my $starttime; 

if (@ARGV) { 
    $starttime = DateTime::Format::ISO8601->parse_datetime($ARGV[0]); 
} 
else { 
    $starttime = DateTime::Format::ISO8601->parse_datetime('1970-01-01T00:00:00'); 
} 

my $feed  = XML::FeedPP->new('http://rss.feed.url'); 
my $num_items = $feed->get_item; 

for (my $i = $num_items - 1; $i >= 0; --$i) { 

    my $item   = $feed->get_item($i); 
    my $company_symbol = $item->{'company:symbol'}; 
    my $pub_date  = DateTime::Format::ISO8601->parse_datetime($item->pubDate); 
    my $title   = $item->title; 

    last if $pub_date < $starttime; 

    next if ref $company_symbol eq 'ARRAY'; 

    if ($title =~ /(.+?) (upgraded|downgraded) to (.+?) from (.+?) at (.+)/) { 

     print join('|', 
      $pub_date->strftime('%Y-%m-%d %h:%m:%s'), 
      $1, 
      $company_symbol, 
      $2, 
      $3, 
      $4, 
      $5 
     ), "\n"; 
    } 
    elsif ($title =~ /(.+?) (initiated) with (\w+) (.+?) at (.+)/) { 

     print join('|', 
      $pub_date->strftime('%Y-%m-%d %h:%m:%s'), 
      $1, 
      $company_symbol, 
      $2, 
      $4, 
      '...None...', 
      $5 
     ), "\n"; 
    } 
}