【问题标题】:How do I replace the values of a hash in an external file?如何替换外部文件中的哈希值?
【发布时间】:2008-12-18 21:59:47
【问题描述】:

对于我的程序,我试图用新创建的值替换外部文件中特定哈希的值。外部文件的值是从键中以制表符分隔的,我已经从外部文件中读取了哈希值。我一直在网上四处寻找,这是我能想到的最接近的方法,但它似乎不起作用。

            open(IN, ">>$file") || die "can't read file $file";
            while (<IN>) {
            print IN s/$hash{$key}/$newvalue/;
            }
           close (IN) 

我不太确定这个公式中缺少什么。

【问题讨论】:

  • 调用输出文件句柄似乎有点奇怪,但无论如何...... :)

标签: perl hash substitution


【解决方案1】:

Tie::File 可以为您解决此问题。

use Tie::File;

tie @array, 'Tie::File', $file or die "Could not tie $file: $!";

for (@array) {
    s/$hash{$key}/$newvalue/;
}
untie @array;

【讨论】:

    【解决方案2】:
    【解决方案3】:

    您正在尝试读取和写入同一个文件,但这是行不通的。您必须阅读,替换然后写入另一个文件。之后,如果您真的想要一个文件,可以将输入文件替换为您刚刚编写的文件。

    【讨论】:

    • 啊,我明白了。那么有没有一种方法可以简单地附加到外部文件中的值?这就是我所需要的,我只是希望替换可以完成这项任务。
    • 这只是同一问题的变体,因此您将得到相同的答案。这实际上是 Perl 的常见问题解答。
    【解决方案4】:

    这不会很有效,但它应该可以工作,除非我的 perl-fu 不好:

    open(IN, "<<$file") || die "can't read file $file";
    open(OUT, ">>${file}.tmp") || die "can't open file $file";
    while (<IN>) {
        print OUT s/$hash{$key}/$newvalue/;
    }
    close(IN);
    close(OUT);
    exec("mv ${file}.tmp $file");
    

    可能有一个命令可以在 perl 中为您执行移动操作,但我不是 perl 人。

    【讨论】:

    • 我觉得这种方法很有趣,我知道你不是 perl 人,但如果你知道,新文件是否会包含原始文件的所有内容,只是替换了必要的部分?
    • 是的,因为如果由于找不到值而没有发生替换,那么$_ 不变,然后被写入OUT
    • 顺便说一句,你想要的功能是 rename(OLD,NEW)
    • 由于某种奇怪的原因,它告诉我它现在无法读取文件。
    • 使用取消链接和重命名(重命名旧备用;重命名新旧;取消链接备用)。
    猜你喜欢
    • 2013-09-10
    • 1970-01-01
    • 2013-07-21
    • 2015-09-20
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    相关资源
    最近更新 更多