使用perl重命名文本文件时,文本文件末尾会出现问号



我是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);

最新更新