我试图通过 Perl 脚本下载链接,如下:
use strict;
use warnings;
use Cwd qw(abs_path);
use File::Path qw(make_path remove_tree);
use LWP::UserAgent();
use LWP::Simple;
use HTML::LinkExtor;
my $path = abs_path();
print "please provide input link from above for example https://ftp.ncbi.nlm.nih.gov/genomes/ASSEMBLY_REPORTS/prokaryote_type_strain_report.txt\n";
defined(my $link = <>) or die "unable to take arguments from command line $!";
my $string = "$link";
$string =~ s/(.*)\///;
my $text_file = print $';
getstore($link, "$path/links_ncbi/$text_file") or die "unable to get required text file $!\n";
rename("$path/links_ncbi/1", "$path/links_ncbi/$'") or die "unable to rename text file $!\n";
它完成了任务;它在所需目录中下载了所需的文本文件,但是当我尝试使用函数
rename
重命名它时,它也这样做了。但是,我总是在文本文件名称后面看到一个问号,如下所示:
prokaryote_type_strain_report.txt?
文件的常量是相同的。我检查了一下,但唯一的就是“?”。请告诉我为什么会发生这种情况以及如何解决它。我还尝试了以下解决方案:
vim +'set ff=unix | x' test.pl
和
dos2unix test.pl
我也试过了
sed -i 's/\r$//' test.pl
正如之前提出的问题中提到的解决方案,但该解决方案是针对 bash 脚本的,但在 Perl 脚本上尝试过,但这不起作用。
我也尝试检查它并执行了以下操作:-
print qq{rename("$path/links_ncbi/1", "$path/links_ncbi/$'")} or die "unable to rename text file $!\n";
但一切看起来都很好,请告诉我哪里做错了,为什么会出现这个“?”出现在重命名文件时,非常需要并感谢您的帮助。 谢谢你。
这里是我尝试过的解决方案的链接。
您的
$link
包含换行符,问号只是此类不可打印字符的占位符。
尝试
chomp($link);
你的代码有很多缺陷。我会讲一些要点。
my $path = abs_path();
从技术上讲,在这样的简单程序中,您不需要获取程序文件所在位置的完整路径。您可以只使用相对路径并跳过所有这些逻辑。
defined(my $link = <>) or die "unable to take arguments from command line $!";
这是不正确的。因为
<>
从输入文件或标准输入读取,所以它可能总是被定义,至少包含一个换行符或一个空字符串。你可能会这样做:
chomp(my $link = <>);
die "Argument required" unless $link;
这个
my $string = "$link";
将输入复制到新变量是没有意义的。使用双引号将变量插入字符串也是没有意义的。
$string =~ s/(.*)\///;
my $text_file = print $';
您使用相当不安全的正则表达式来修剪输入字符串,这将“在斜杠
/
之前接受任何字符0次或多次,并且不替换任何内容。将匹配的字符存储在$1
中(因为括号)” .
然后打印
$'
匹配后变量,它会向 $text_file
返回 1,因为 print 始终返回 1。您可能只返回 $'
,其中可能包含您的文件名。或者只使用 $string
,它应该包含相同的内容,因为您删除了直到最后一个斜杠的所有内容。
getstore($link, "$path/links_ncbi/$text_file") or die "unable to get required text file $!\n";
rename("$path/links_ncbi/1", "$path/links_ncbi/$'") or die "unable to rename text file $!\n";
所以现在您将文件
getstore
更改为文件名1
,然后将文件从1
重命名为$'
。唷!这是复杂的事情。
跳过所有这些,并使用类似的东西
chomp(my $link = <>);
die "Argument required" unless $link;
my $filename = $link =~ s/.*\///r; # remove path return file name
getstore($link, $filename);