我正在开发一个小的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;
}
感谢您的任何想法或意见:)
编辑:我将相关行的行号放在代码行的前面。
答案 0 :(得分:6)
这一切都归结为更好地处理输入文件的结尾。
在CreateEntity.pl第52行第5行的chomp中使用未初始化的值$ line。
<HANDLE>
返回undef表示您已到达文件末尾。您忽略此操作并尝试选择返回的值。
在CreateEntity.pl第52行第5行的字符串ne中使用未初始化的值$ line。
错误报告的行号。警告实际上来自$line ne "END"
。
$line
在到达文件末尾时仍未定义。
在CreateEntity.pl第67行使用未初始化的值$ string替换(s ///),
在CreateEntity.pl第68行使用未初始化的值$ string替换(s ///),
trim( $line ) ~~ "NAME:"
$line
在到达文件末尾时仍未定义。
在CreateEntity.pl第67行使用未初始化的值$ string替换(s ///),
在CreateEntity.pl第68行使用未初始化的值$ string替换(s ///),
trim( $line) ~~ "FIELDS:"
$line
在到达文件末尾时仍未定义。
你应该只修剪一次线,如果你要修剪就不需要修剪。
一闪而过,我想我知道你的根本问题是:)
您的数据文件包含Windows行结尾。你选择了这一行,只留下"END\r"
而不是"END"
。 dos2unix
命令行工具可以解决这个问题,trim
ming也是如此。
while (my $line = <HANDLE>) {
$line = trim( $line );
last if $line eq "END";
...
}