2013-02-19 19 views
0

我正在开发一个小的Perl脚本来自动执行一些服务器任务,当我在Windows计算机上测试它时一切正常,但是当我将它上载到Linux服务器时,脚本返回多个:在Windows和Linux下使用未初始化的值更改

Use of uninitialized value $line in chomp at CreateEntity.pl line 52, <HANDLE> line 5. 
Use of uninitialized value $line in string ne at CreateEntity.pl line 52, <HANDLE> line 5. 
Use of uninitialized value $string in substitution (s///) at CreateEntity.pl line 67, <HANDLE> 
Use of uninitialized value $string in substitution (s///) at CreateEntity.pl line 68, <HANDLE> 
Use of uninitialized value $string in substitution (s///) at CreateEntity.pl line 67, <HANDLE> 
Use of uninitialized value $string in substitution (s///) at CreateEntity.pl line 68, <HANDLE> 

这里是代码本身:

#!/usr/bin/env perl 

# This fils SHOULD go in the root of Symfony... put it anywhere else AT YOUR OWN RISK !!! 

use warnings; 

# Declare the subroutines 
sub trim; 

if(!defined $ARGV[0]) 
{ 
    die("No FilePath Specified!\n"); 

} 

my $entityFile = $ARGV[0]; 

open(HANDLE, $entityFile) or die("The file could not be open!"); 

my $entityCmd = "php app/console doctrine:generate:entity --entity=\"rapliqBundle:"; 
my $entityName = ""; 

chomp(my $line = (<HANDLE>)); 
$line = trim($line); 
while($line ne "END") 
{ 
    if(trim($line) ~~ "NAME:") 
    { 
     chomp($line = (<HANDLE>)); 
     $entityName = trim($line); 
     $entityCmd = $entityCmd . $entityName; 
     $entityCmd = $entityCmd . "\" --fields=\""; 
    } 
    elsif(trim($line) ~~ "FIELDS:") 
    { 
     chomp($line = (<HANDLE>)); 
     my @data = split('=', $line); 
     foreach my $val (@data) 
     { 
      $val = trim($val); 
      if($val ~~ lc "string") 
      { 
       $entityCmd = $entityCmd . $val . "(255) "; 
      } 
      else 
      { 
       $entityCmd = $entityCmd . $val . ":"; 
      } 
     } 
    } 

    52: chomp($line = (<HANDLE>)); 
} 

close(HANDLE); 
$entityCmd = $entityCmd . "\""; 

#print $entityCmd; 

system($entityCmd); 
system("php app/console doctrine:generate:entities rapliqBundle:" . $entityName); 
system("php app/console doctrine:schema:update --force"); 

sub trim 
{ 
    my $string = $_[0]; 
    67:$string =~ s/^\s+//; 
    68:$string =~ s/\s+$//; 
    return $string; 
} 

感谢您的任何想法或意见:)

编辑:我把行号为关注在代码行前面。

回答

6

这一切都归结为更好地处理输入文件的末尾。

  1. 在CreateEntity.pl线52使用在格格未初始化值$线,线5

    <HANDLE>返回undef表示你已经到达了文件的末尾。你忽略这一点,并尝试chomp返回的值。在CreateEntity.pl线52

  2. 使用字符串NE初始化值$线,线5

    误报行号。该警告实际上来自$line ne "END"

    $line从到达文件末尾时仍未定义。

  3. 使用未初始化值$字符串在CreateEntity.pl线67替代(S ///),在CreateEntity.pl线替代(S ///)

  4. 使用未初始化值$字符串68,

    trim($line) ~~ "NAME:"

    $line仍然从已经到达文件的结尾未定义的。

  5. 使用未初始化值$字符串在CreateEntity.pl线67替代(S ///),在CreateEntity.pl线替代(S ///)

  6. 使用未初始化值$字符串68,

    trim($line) ~~ "FIELDS:"

    $line仍然从已经到达文件的结尾未定义的。

您应该只修剪一条线,如果您要修剪,则无需修饰。


在光华一闪,我想我知道你根本问题是:)

你的数据文件中有Windows行结尾。你踩着这条线,留下"END\r"而不是"END"dos2unix命令行工具可以解决这个问题,并且trim明。

while (my $line = <HANDLE>) { 
    $line = trim($line); 
    last if $line eq "END"; 
    ... 
} 
+0

我已经添加到我的答案。 – ikegami 2013-02-19 21:48:08