0

一部のサーバー タスクを自動化する小さな 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;
}

アイデアやコメントをありがとう:)

編集:コード行の前に、関係する行の行番号を付けました。

4

1 に答える 1

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 での置換 (s///) での初期化されていない値 $string の使用、

  4. CreateEntity.pl 行 68 での置換 (s///) での初期化されていない値 $string の使用、

    trim( $line ) ~~ "NAME:"

    $lineファイルの終わりに達したため、まだ定義されていません。

  5. CreateEntity.pl 行 67 での置換 (s///) での初期化されていない値 $string の使用、

  6. CreateEntity.pl 行 68 での置換 (s///) での初期化されていない値 $string の使用、

    trim( $line) ~~ "FIELDS:"

    $lineファイルの終わりに達したため、まだ定義されていません。

ラインをトリミングするのは 1 回だけにしてください。トリミングする場合はむさぼり食う必要はありません。


一瞬の輝きで、私はあなたが根本的な問題を抱えていることを知っていると思います:)

データ ファイルには Windows の行末があります。あなたはラインをむさぼり食い、"END\r"代わりに"END". dos2unixコマンドラインツールはそれを修正し、mingtrimも修正します.

while (my $line = <HANDLE>) {
   $line = trim( $line );
   last if $line eq "END";
   ...
}
于 2013-02-19T21:37:55.593 に答える