perl - 如何忽略带有 `perl -i` 的只读文件?

标签 perl file-io readonly

Perl 的 -i开关似乎修改只读文件:

$ echo 'foobar' > tmp.txt
$ chmod -w tmp.txt
$ perl -pi -w -e 's/foobar/FOOBAR/' tmp.txt
$ cat tmp.txt
FOOBAR

这是出乎意料的,因为该命令不应该能够根据其权限修改文件。预计,尝试通过其他方式更新它失败:
$ echo 'barbaz' > tmp.txt
-bash: tmp.txt: Permission denied

为什么 Perl 修改只读文件(以及如何修改?),最重要的是:我怎样才能让 Perl 不这样做?

我能在这方面找到的唯一信息丰富的资源是在 Perl FAQ 中。 :

The permissions on a file say what can happen to the data in that file. … If you try to write to the file, the permissions of the file govern whether you're allowed to.



最终似乎它说它不应该写入它,因为文件系统说你不能。

最佳答案

过滤器 @ARGVBEGIN块:

perl -pi -e 'BEGIN{@ARGV=grep{-w $_}@ARGV} s/foobar/FOOBAR/' files

现在,如果命令行上的文件都不可写,@ARGV将是空的,ARGV文件句柄将尝试从 STDIN 读取.我可以想到两种方法来防止这成为问题:
  • 关闭 STDINBEGIN也堵
    perl -pi -e 'BEGIN{close STDIN;@ARGV=grep{-w $_}@ARGV}s/foobar/FOOBAR/' files
    
  • 始终从 /dev/null 调用此单行重定向输入
    perl -pi -e 'BEGIN{@ARGV=grep{-w $_}@ARGV}s/foobar/FOOBAR/' files < /dev/null
    
  • 关于perl - 如何忽略带有 `perl -i` 的只读文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15791611/

    相关文章:

    perl - 如何在 Perl 中构建一个简单的菜单?

    Python 从文件中删除用户选择的一行

    javascript - 将文本框设置为只读在 Javascript 中不起作用

    只读系统上的 Linux ping 命令

    perl - 通过 perl mechanize 提取唯一 URL 和相关链接文本的最佳方法是什么?

    sql - 如何在 DBIx::Class 结果集搜索中检索每个组中的最新记录?

    perl - 查找两个文件之间第一列的匹配模式,并在第三个文件中打印每个文件中的行

    C++ fstream,从文本中读取数据并执行数学运算?

    Android:媒体文件从文件系统中消失

    python - 只读对象模型的 SqlAlchemy 优化