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

问题描述 投票:0回答:2

我试图通过 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";

但一切看起来都很好,请告诉我哪里做错了,为什么会出现这个“?”出现在重命名文件时,非常需要并感谢您的帮助。 谢谢你。

这里是我尝试过的解决方案的链接。

perl rename
2个回答
4
投票

您的

$link
包含换行符,问号只是此类不可打印字符的占位符。

尝试

chomp($link);


3
投票

你的代码有很多缺陷。我会讲一些要点。

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);
© www.soinside.com 2019 - 2024. All rights reserved.