簡體   English   中英

如何在Perl中使用UNIX命令? (在Windows計算機上使用)

[英]How to use UNIX commands in Perl? (to be used on a Windows machine)

我需要通過第二個文件(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

有人知道我能做什么嗎?

我可能只是在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 }

正如@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

我懷疑您確實要在程序中而不是在臨時文件中使用過濾后的行,這樣可以避免使用臨時文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM