使用perl中的哈希表重命名文件

时间:2014-04-26 09:35:02

标签: perl file

我制作了一个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 = '';
}

1 个答案:

答案 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