Perl菱形运算符(<>)不处理文件名模式?

时间:2015-05-07 11:41:39

标签: perl

似乎<>运算符无法处理文件名模式,例如file * .txt。有这种需求的解决方案吗?例如,以某种名称模式(perl -i.bak -pe s/p1/p2/g file*.txt)替换文件中的模式。我使用的是Windows,cmd.exe也没有扩展文件名模式。

3 个答案:

答案 0 :(得分:4)

在* nix中,shell负责扩展路径中的通配符。在MSWin中,它是在应用程序上完成的。

perl -i~ -we "@ARGV = glob shift; s/p1/p2/g, print while <>" file*.txt

答案 1 :(得分:4)

glob运算符用于扩展文件名中的通配符;见perldoc -f glob。但是,内置的将空格视为分隔符,这意味着它不能正确处理文件名中的空格。将其替换为File::Glob中的:bsd_globFile::Glob是一个标准模块,随Perl一起安装。有关标准模块的列表,请参阅perldoc perlmodlib

use File::Glob qw( :bsd_glob );
@ARGV = map { glob } @ARGV;

这就是你如何将它融入你的单行内容:

perl -i.bak -MFile::Glob=:bsd_glob -pe"BEGIN { @ARGV = map glob, @ARGV } s/p1/p2/g" *.txt

答案 2 :(得分:0)

根据@choroba的回答,我认为使用BEGING块来翻译野人也很有效。

perl -i.bak -pe"BEGIN{@ARGV=glob shift}s/p1/p2/g" file*.txt

或以下适用于多种输入模式:

perl -i.bak -pe"BEGIN{@ARGV=map glob,@ARGV}s/p1/p2/g" file*.txt