我是Perl新手,我试图通过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.txtn";
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 $!";
这是不正确的。因为<>
从输入文件或stdin读取,所以它可能总是被定义的,至少包含一个换行符或一个空字符串。你可以做一些类似的事情:
chomp(my $link = <>);
die "Argument required" unless $link;
这个
my $string = "$link";
将输入复制到新变量是毫无意义的。使用双引号将变量插入字符串也是毫无意义的。
$string =~ s/(.*)///;
my $text_file = print $';
您可以使用一个相当不安全的regex来修剪输入字符串,这将执行"在斜线/
之前,将任意字符取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);