我制作了一个perl代码,如下所示。这里我要做的是首先从包含带有标题的HTTP URL的文本文件中获取输入。 因此,第一个正则表达式是标题,第二个正则表达式从URL内部获取id。 所有这些值都插入到哈希表%myfilenames()。
中因此,此哈希表具有作为URL id的键,以及作为Title的值。到目前为止一切正常,现在我的计算机上有一组文件,其名称中包含我们从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 "$key\t\t$value";
$myfilenames{$key} = $value;
$key = '';
$value = '';
}
}
#while ( my ( $k, $v ) = each %myfilenames ) { print "$k $v\n"; }
my @files = read_dir 'C:\\inputfolder';
for (@files) {
if ( $_ =~ /\d{6}/ ) {
$oldval = $&;
}
$newval = $myfilenames{$oldval};
chomp($newval);
print $_ , "\t\t$newval" . "\n";
$key = '';
}
答案 0 :(得分:1)
您可能没有在路径前添加文件名。以下适用于我(在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