在Windows和Linux下使用未初始化的值更改

时间:2013-02-19 21:28:06

标签: perl

我正在开发一个小的Perl脚本来自动执行某些服务器任务,当我在我的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;
}

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

编辑:我将相关行的行号放在代码行的前面。

1 个答案:

答案 0 :(得分:6)

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

  1. 在CreateEntity.pl第52行第5行的chomp中使用未初始化的值$ line。

    <HANDLE>返回undef表示您已到达文件末尾。您忽略此操作并尝试选择返回的值。

  2. 在CreateEntity.pl第52行第5行的字符串ne中使用未初始化的值$ line。

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

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

  3. 在CreateEntity.pl第67行使用未初始化的值$ string替换(s ///),

  4. 在CreateEntity.pl第68行使用未初始化的值$ string替换(s ///),

    trim( $line ) ~~ "NAME:"

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

  5. 在CreateEntity.pl第67行使用未初始化的值$ string替换(s ///),

  6. 在CreateEntity.pl第68行使用未初始化的值$ string替换(s ///),

    trim( $line) ~~ "FIELDS:"

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

  7. 你应该只修剪一次线,如果你要修剪就不需要修剪。


    一闪而过,我想我知道你的根本问题是:)

    您的数据文件包含Windows行结尾。你选择了这一行,只留下"END\r"而不是"END"dos2unix命令行工具可以解决这个问题,trim ming也是如此。

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