在下面的perl代码中,我打算使用以下命令将一个perl变量$ file从一个目录复制到另一个目录:
"system("cp $file $Output_Dir);
此命令可以记下文件名,然后显示:
cp: cannot stat 'tasmax_AFR-44_CNRM-CERFACS-CNRM-CM5_historical_r1i1p1_CLMcom-CCLM4-8-17_v1_day_19910101-19951231.nc': No such file or directory
命令
system("@sixfiles = ls $Vars[$kk]}*");
给我错误: sh:1:=:找不到 我想知道这段代码有什么问题。协助将不胜感激。
#!/usr/bin/perl -w
use strict;
use warnings;
use File::Path;
use File::Copy;
my $debug = 1;
my @Vars = ("pr","tasmin","tasmax");
my $Vars;
my @sixfiles;
my $sixfiles;
my $Input_Dir = "/home/zmumba/DATA/Input_Dir";
my $Output_Dir = "/home/zmumba/DATA/Output_Dir";
for (my $kk=0; $kk < @Vars; ++$kk) {
opendir my $in_dir, $Input_Dir or die "opendir failed on $Input_Dir: $! ($^E)";
while (my $file=readdir $in_dir) {
next unless $file =~ /^$Vars[$kk]/;
next if -d $file;
print "$file\n";
print "Copying $file\n" if $debug;
my $cmd01 = "cp $file $Output_Dir";
print "Doing system ($cmd01)\n" if $debug;
system ($cmd01);
system("@sixfiles = ls $Vars[$kk]}*");
}
}
答案 0 :(得分:0)
尝试一下:
use feature qw(say);
use strict;
use warnings;
use File::Spec;
my @Vars = ("pr","tasmin","tasmax");
my $Input_Dir = "/home/zmumba/DATA/Input_Dir";
my $Output_Dir = "/home/zmumba/DATA/Output_Dir";
opendir my $in_dir, $Input_Dir or die "opendir failed on $Input_Dir: $! ($^E)";
while (my $file=readdir $in_dir) {
next if ($file eq '.') || ($file eq '..');
next if -d $file;
next if !grep { $file =~ /^$_/ } @Vars;
say "Copying $file";
$file = File::Spec->catfile( $Input_Dir, $file );
system "cp", $file, $Output_Dir;
}
答案 1 :(得分:0)
system ($cmd01);
礼物:
cp: cannot stat '<long-but-correct-file-name>': No such file or directory
这几乎可以肯定是因为您没有运行$Input_Dir
中的代码,所以该文件在当前目录中不存在。您需要chdir
到正确的目录,或将目录路径添加到文件名变量的前面。
system("@sixfiles = ls $Vars[$kk]}*");
此代码没有任何意义。传递给system()
的代码必须是Unix shell代码。这就是ls $Vars[$kk]}*
位(但是我不确定}
的来源)。您不能在shell命令中填充Perl数组。您需要捕获ls
命令返回的值,然后以某种方式解析它以将其分成一个列表。
答案 2 :(得分:0)
您可以尝试以下代码:
#!/usr/bin/env perl
use strict;
use warnings;
my $debug = 1;
my @Vars = ("pr", "tasmin", "tasmax");
my $Vars;
my $Input_Dir = "/home/zmumba/DATA/Input_Dir";
my $Output_Dir = "/home/zmumba/DATA/Output_Dir";
my $cpsrc, $cpdest = '';
print "No Write Permission: $!" unless(-w $Output_Dir);
for my $findex (0 .. $#Vars) {
$cpsrc = qq($Input_Dir/$Vars[$findex]);
print "$Vars[$findex]\n";
print "Copying $Vars[$findex]\n" if $debug;
my $cmd01 = "cp $cpsrc $Output_Dir";
print "Doing system ($cmd01)\n" if $debug;
system($cmd01);
}
您不必遍历源目录中的每个文件。您已经知道要从源复制的文件。