我编写了一些Perl代码并使用Perl工具链。这是我的代码
my $sourcedir = $ENV{"SOURCE"};
my $targetdir = $variables{'DRIVE_LOCATION'};
my $artifactdir = $ENV{"ARTIFACT"};
my $appname = $ENV{"APPNAME"};
my $filetype = $ENV{"FILETYPE"};
my $ver = $ENV{versionName};
print "targetdir $target_dir \n";
my ( $buildno, $ver ) = @ARGV;
$Artifactname = "Android_{$app_name}.$ver";
print "artifact $Artifactname\n";
mkdir $Artifactname;
opendir( my $DIR, $sourcedir ) || die "can't opendir $source_dir: $!";
my @files = readdir($DIR);
foreach my $t ( sort grep( /^.*\.$filetype/, @files ) )
{
if ("$sourcedir/$t")
{
copy "$sourcedir/$t", "./$Artifactname/$t";
print " pathname $artifactdir/$Artifactname \n ";
dircopy( "$artifactdir/$Artifactname", "$targetdir/$Artifactname" );
}
}
closedir($DIR);
当我运行此代码时,我收到以下错误
Use of uninitialized value $app_name_ in concatenation (.) or string at
Scripts/perl/copyfiles.pl line 29 (#3)
Use of uninitialized value $ver in concatenation (.) or string at
Scripts/perl/copyfiles.pl line 29 (#3)
也无法使用值创建目录。请任何人都可以帮忙。
my $ver = $ENV{versionName} // versionName
是环境变量。
答案 0 :(得分:1)
首先关闭:
$Artifactname = "Android_{$app_name}.$ver
但你宣布$appname
。错误消息告诉您这一点。
然后 - $ver
您从@ARGV
读出来 - 它从%ENV
中删除了您设置的内容。但是你永远不会检查是否有@ARGV
包含数据,所以很可能 - 没有传递参数,因此这个值也是未定义的。
my ( $buildno, $ver ) = @ARGV;
(并且my
重新声明了它,因此也会出错。
如果你想做默认,那么:
my ( $buildno, $ver ) = @ARGV;
$ver //= $ENV{'versionName'}; #conditional assignment.
另外 - 如果您正在执行opendir
/ readdir
/ grep
,您是否考虑过仅使用glob
?
foreach my $filename ( glob ( "$sourcedir/*.$filetype") ) {
因为这也会给你完整的路径。