【发布时间】:2017-06-23 02:29:58
【问题描述】:
我知道这是在编写 Perl 脚本时很常见的问题,但我找不到解决方案,而且可能很简单。
我的数据文件夹中有两个文件夹:BWA_1 和 BWA_2。我想打印这些文件夹中某个文件的完整路径的文件名。为此,我在脚本中有这些行。
my $rpath="/home/seq4/Desktop/data/";
for ( my $i = 1; $i <= 2; $i++ ) {
my $BWA_dir = $rpath . "BWA_" . $i;
print "$BWA_dir\n";
my $bam_file = glob("$BWA_dir/*SNP.bam");
print "$bam_file\n";
}
当我执行它时:
/home/seq4/Desktop/data/BWA_1
/home/seq4/Desktop/data/BWA_1/subset_fusa.SNP.bam
/home/seq4/Desktop/data/
Use of uninitialized value $bam_file in concatenation (.) or string at sc.pl line 17.
我该如何解决这个问题?
文件存在。如果我改变这一行:
my $bam_file = glob("$BWA_dir/*SNP.bam");
有了这个(两个文件同名):
my $bam_file = $BWA_dir . "/subset_fusa.SNP.bam";
输出:
/home/seq4/Desktop/data/BWA_1
/home/seq4/Desktop/data/BWA_1/subset_fusa.SNP.bam
/home/seq4/Desktop/data/BWA_2
/home/seq4/Desktop/data/BWA_2/subset_fusa.SNP.bam
文件存在...:
ls -la BWA_2/
total 8
drwxrwxr-x 2 seq4 alg89 4096 nov 17 17:16 .
drwxrwxr-x 4 seq4 alg89 4096 nov 17 17:15 ..
-rw-rw-r-- 1 seq4 alg89 0 nov 17 17:16 subset_fusa.SNP.bam
【问题讨论】:
-
请注意,如果您不使用通配符,
glob将打印文件名,即使它不匹配。请改用ls查看您的文件。 -
如果 BWA_2 中有一个具有该名称的文件,并且您拥有完全权限,那么我认为我们无法复制此内容。也许告诉我们
print glob('/home/Desktop/data/BWA_2/*SNP.bam')和ls -la /home/Desktop/data/BWA_2的输出。 -
您的编辑并不能证明第二个文件存在。您只是打印一个字符串,而不是检查文件是否存在。如果添加
print "$bam_file exists: ", -f $bam_file, "\n";之类的代码,您会看到什么? -
在 sc.pl 第 13 行的串联 (.) 或字符串中使用未初始化的值 $bam_file。在 sc.pl 第 13 行的 -f 中使用未初始化的值 $bam_file。在打印中使用未初始化的值在 sc.pl 第 13 行。存在:
-
它似乎不存在..但是...为什么第一个文件是的?我的意思是,我已经创建了这两个文件,只需输入: touch BWA_1/subset_fusa.SNP.bam BWA_2/subset_fusa.SNP.bam
标签: perl