2016-03-21 3 views
0

背景:使用27

イムないPERLの専門家が、PerlとPHPの新しいバージョンすべてに新しいサーバーにいくつかのスクリプトの移行に取り組んで他の人は働いていますが、この特定の人は働きません。

このスクリプトが実行するために必要なすべてのモジュールがインストールされており、それらのPM関連のエラーは終了しました。

環境:

  • のUbuntu 12.04 LTSを実行しているWebサーバーの64ビット
  • のApache 2
  • Mysqlの
  • PHP5
  • FreeTDSの
  • すべてのファイアウォール権限とリモートデータベース接続 がテストされ、
  • ALLが機能スクリプトをテストした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を返します空の文字列と評価さ

どちらもリファレンスではないため

ハッシュ要素が配列参照かどうかをチェックするため、

全く括弧で10
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"; 
    } 
} 
関連する問題