我制作了一个perl代码,如下所示。在这里,我要做的是首先从一个文本文件中获取输入,该文件由一个带标题的HTTPURL组成。因此,第一个正则表达式是标题,第二个正则表达式从URL内部获取id。所有这些值都插入到哈希表%myfilenames()中。
所以这个哈希表的关键字作为URL id,值作为标题。在这里之前一切都很好,现在我的电脑上有一组文件,它们的名字中有我们从URL中提取的ID。
我想做的是,如果ID在哈希表中,那么文件名应该更改为分配给ID的值。现在,最后一个函数中print语句的输出是正确的,但我无法重命名文件。我尝试了很多方法,但都无效。有人能帮忙吗。
示例:
URL: https://abc.com/789012 <--- ID
Value (new Title) : ABC
file name on computer = file-789012 <---- ID
new file name = ABC
我的代码:
use File::Slurp;
use File::Copy qw(move);
open( F, '<hadoop.txt' );
$key = '';
$value = '';
%myfilenames = ();
foreach (<F>) {
if ( $_ =~ /Lecture/ ) {
$value = $_;
}
if ( $_ =~ /https/ ) {
if ( $_ =~ /d{6}/ ) {
$key = $&;
}
}
if ( !( $value eq '' || $key eq '' ) ) {
#print "$keytt$value";
$myfilenames{$key} = $value;
$key = '';
$value = '';
}
}
#while ( my ( $k, $v ) = each %myfilenames ) { print "$k $vn"; }
my @files = read_dir 'C:\inputfolder';
for (@files) {
if ( $_ =~ /d{6}/ ) {
$oldval = $&;
}
$newval = $myfilenames{$oldval};
chomp($newval);
print $_ , "tt$newval" . "n";
$key = '';
}
您可能没有预先设置文件名的路径。以下适用于我(在Linux上):
#!/usr/bin/perl
use warnings;
use strict;
use File::Slurp qw{ read_dir };
my $dir = 0;
mkdir $dir;
open my $FH, '>', "$dir/$_" for 123456, 234567;
my $key = my $value = q();
my %myfilenames = ();
for (<DATA>) {
chomp;
$value = $_ if /Lecture/;
$key = $1 if /https/ and /(d{6})/;
if ($value ne q() and $key ne q()) {
$myfilenames{$key} = $value;
$key = $value = q();
}
}
my @files = read_dir($dir);
for (@files) {
if (/(d{6})/) {
my $oldval = $1;
my $newval = $myfilenames{$oldval};
rename "$dir/$oldval", "$dir/$newval";
}
}
__DATA__
Lecture A1
https://123456
# Comment
Lecture A2
https://234567