如何在Perl中使用UNIX命令? (在Windows机器上使用)

时间:2016-08-23 15:20:47

标签: windows perl batch-file unix

我需要通过第二个文件(OEMDS.txt)的内容过滤一个文件(javasrc.txt)的内容。这需要在Windows环境中完成。我不知道Windows批处理文件,我知道UNIX命令,我是Perl的新手,我想让我的生活尽可能简单,所以我想写一个UNIX命令,把“system()”围绕它,它应该工作。

不幸的是,它似乎并不那么简单:以下Perl脚本拒绝工作:

system("cat javasrc.txt | grep -v qx(cat OEMDS.txt) > javasrc_temp.txt");

我收到错误消息:

grep: OEMDS.txt): No such file or directory

供您参考:我已使用以下内容启动cat命令:

- backticks
- $()
- qx()
- qx{}

总是结果是一样的:Perl似乎有一个终止字符的问题(第二个反引号或逗号,......)

现在我考虑一下,我按照以下方式启动它(我不知道它是否相关):

perl filter_by_file_content.pl

有人知道我能做什么吗?

2 个答案:

答案 0 :(得分:3)

我可能只是在perl中做这样的事情 - 不需要system命令。

#!/usr/bin/env perl
use strict;
use warnings;

open ( my $exclude_list, '<', 'OEMDS.txt' ) or die $!; 
my $exclude_regex = join ( "|", map { s/[\r\n]//r } <$exclude_list> );
$exclude_regex = qr/($exclude_regex)/;
open ( my $src, '<', 'javasrc.txt' ) or die $!;
while ( <$src> ) { 
    print unless m/$exclude_regex/; 
}

注意 - 表示排除文件中的任何元字符都将被视为正则表达式。如果这是一个问题,您可以使用map { quotemeta }

答案 1 :(得分:1)

如@ThisSuitIsBlackNot所示,请在perl中执行此操作。这不是很多代码,反正可能更快:

my $oemds = do {
    open my $fh, '<', 'OEMDS.txt' or die "Can't read OEMDS.txt: $!";
    local $/; # probably not required.
    <$fh>;
};
chomp $oemds;

open my $js, '<', 'javasrc.txt' or die "Can't read javasrc.txt: $!";

my @filtered;
while(<$js>) {
    chomp;
    next if /$oemds/; # grep -v
    push @filtered, $_;
}
close $js;

# write to javasrc_temp.txt if really required

我怀疑你真的想要程序中的过滤行,而不是临时文件,这样可以避免临时文件。