2

ファイルから行を一致させ、特定の部分を抽出しようとしています。私の正規表現は、私が見つけたすべてのオンライン テスターで動作しますが、私の perl では動作しません。バージョン v5.10.0 を使用していますが、更新できません。

正規表現は次のようになります。

sub parse_bl_line {
    if ($_[0] =~ m/^copy\s+.*?\s+(.*?\_.*)/) {
             return $1;
    } else {
             log_msg("Line discarded: $_[0]", 4);
     return "0";
    }

}

一致するはずのテストデータの数行 (最後の一致のみ):

@bl_lines = (
"copy xxxxxx_/cpu     b_relCAP_R3.0-1_INT5_xxxxx_cpu_p1",
"copy xxxxxxxx_/va_xxx_parameters    b_relCAP_R3.0-1_INT5_xxxxx_va_xxx_parameters_p1",
"copy xxxxxxxx_/xxxxxxx_view.tcl      b_relCAP_R3.0-1_INT5_xxxxxx_view.tcl_p0",
"copy xxxxx_/xxxxxarchivetool.jar   b_relEARLY_DROP1_xxxxxarchivetool.jar_xx");

そして関数を呼び出します:

foreach(@bl_lines) {
    $file=parse_bl_line($_);
    if ($file !~ "0") {
            log_msg("Line accepted: $_", 4);
            log_msg("File extracted: $file", 4);
    }else { 
            log_msg("Line rejected: $_", 2);
    }

}

私は最後の部分を一致させようとしています。

b_relEARLY_DROP1_xxxxxarchivetool.jar_xx

出力は次のようになります。

20120726 13:15:34 - [XXX] ERROR: Line rejected: copy xxxxxx_/cpu     b_relCAP_R3.0-1_INT5_xxxxx_cpu_p1
20120726 13:15:34 - [XXX] ERROR: Line rejected: copy xxxxxxxx_/va_xxx_parameters    b_relCAP_R3.0-1_INT5_xxxxx_va_xxx_parameters_p1
20120726 13:15:34 - [XXX] ERROR: Line rejected: copy xxxxxxxx_/xxxxxxx_view.tcl      b_relCAP_R3.0-1_INT5_xxxxxx_view.tcl_p0
20120726 13:15:35 - [XXX] INFO: Line accepted: copy xxxxx_/xxxxxarchivetool.jar   b_relEARLY_DROP1_xxxxxarchivetool.jar_xx 
20120726 13:15:35 - [XXX] INFO: File extracted: b_relEARLY_DROP1_xxxxxarchivetool.jar_xx

ヒント @BaL が提案したいくつかのテストを行ったところ、選択括弧がなくてもパターン マッチングが機能することがわかりました。

if ($_[0] =~ m/^copy\s+.+?\s+.+?\_.+$/) {
4

4 に答える 4

2

テスト : は、最後の文字列のみの場合である任意の位置にa が含まれていないif ($file !~ "0") {場合に trueです。$file0

if ($file ne '0') {:またはさらに短い :を使用したいと思います:if ($file) {

これとは別に、あなたは本当にuse strict;そして use warnings常にすべきです。

于 2012-07-27T12:24:04.783 に答える
0

何を一致させようとしていますか?最後の部分?一致するものがあることがわかっている場合は、*を使用しないでください。代わりに+を使用してください。

if ($_[0] =~ m/^copy\s+.+?\s+(.\+?)$/) {
    return $1;
}
于 2012-07-25T15:39:37.927 に答える
0

テストファイルの最後の行が「\n」で終わらない唯一の行だと思います。面白い小さなバガーはいつも邪魔をしています.....

于 2012-07-25T15:42:27.227 に答える
0

文字列比較を行っているため、if ステートメントの比較演算子を !~ から ne に変更します。この変更を行うと、すべてのログ行が受け入れられました。

これを perl 5.10 ではなく 5.14.2 でテストしましたが、特別な機能は使用しませんでした。試してごらん!コードは以下のとおりです。

use 5.14.2;

sub log_msg{
    say shift;  
}

sub parse_bl_line {
    if ($_[0] =~ m/^copy\s+.*?\s+(.*?\_.*)/) {             
        return $1;     
    }
    else {              
        log_msg("Line discarded: $_[0]", 4);      
        return "0";     
    }
}

my @bl_lines = ( 
    "copy xxxxxx_/cpu                    b_relCAP_R3.0-1_INT5_xxxxx_cpu_p1",
    "copy xxxxxxxx_/va_xxx_parameters    b_relCAP_R3.0-1_INT5_xxxxx_va_xxx_parameters_p1", 
    "copy xxxxxxxx_/xxxxxxx_view.tcl     b_relCAP_R3.0-1_INT5_xxxxxx_view.tcl_p0", 
    "copy xxxxx_/xxxxxarchivetool.jar    b_relEARLY_DROP1_xxxxxarchivetool.jar_xx"
);  

foreach(@bl_lines) {     
    my $file = parse_bl_line($_);     
    if ($file ne "0") {    # Changed the comparison operator here         
        log_msg("Line accepted: $_", 4);             
        log_msg("File extracted: $file", 4);
    }
    else {              
        log_msg("Line rejected: $_", 2);     
    } 
}

于 2012-07-27T11:49:33.620 に答える