在 Perl 中解析文本文件并获取特定字符串

Parse text file in Perl and get a specific string

我的 $ENV{"buildPath"} 中有一个 branch_properties.txt 文件,其中包含字符串 TEST_SEQUENCE=BasicTEST_SEQUENCE=Extended.

我需要获取 TEST_SEQUENCE 之后的值并将其放入变量中。

sub GetValueForTestSequenceSplit {

  my $filePath    = $ENV{"buildPath"} . "\" . "branch_properties.txt";
  my $fileContent = "";

  open(my $fileHandle, "<", $filePath)
      or die("Cannot open '" . $filePath . "' for reading! " . $! . "!");

  while (my $line = <$fileHandle>) {
    chomp $line;

    my @strings = $line =~ /sequence/;

    foreach my $s (@strings) {
      print $s;
    }
  }

  close($fileHandle);
}

我哪里错了? Jenkins 中的控制台行输出没有任何显示。

尝试使用正则表达式:

my $variable;
if ($line =~ /TEST_SEQUENCE=(\w+)/){
  $variable = ;
}

几件事:

  • 使用 File::Spec 构建 branch_properties.txt 文件的全名。 \ 不适用于 Unix 系统。
  • 使用 -d 测试验证 $ENV{BuildPath} 是一个有效的目录。
  • 我正在尝试了解您的问题和您提供的程序。我看不到你是如何寻找特定的行,然后提取你想要的值。
  • "console line output in Jenkins shows nothing"是什么意思?你是说 Jenkins 没有在建造?你看到 Jenkins 正在做一些事情,但是当它运行时你没有看到任何输出?您可以添加一些 warn 语句来打印出您所在的位置吗? Jenkins 是说构建失败了吗?

这是经过一些修改的程序:

sub GetValueForTestSequenceSplit {

    use File::Spec;

    if ( not -d $ENV{buildPath} ) {
       die qq(Directory "$ENV{BuildPath}" doesn't exist);
    }

    my $filePath = File::Spec->join( $ENV{buildPath},
        branch_properties.txt";

    open( my $fileHandle, "<", $filePath )
       or die qq(Cannot open $filePath for reading! $!);  # 1.

    my $test_sequence_value;                              # 2.
    while( my $line = <$fileHandle> ) {
        chomp $line;
        next unless $line =~ /^\s*TEST_SEQUENCE\s*=\s*(.*)\s*/; # 3.
        $test_sequence_value = ;
        last;
    }
    close $fileHandle;
    if ( defined $test_sequence_value ) {                 # 4.
        # Whatever you do if you find that value...
        return $test_sequence_value;
    }
    else {
        # Whatever you do if the value isn't found...
        return;
    }

以及上面的注释:

  1. Perl 可以插入标量变量值。这样可以更轻松地阅读您正在打印的内容。此外,您可以使用 qq(...) 代替标准双引号。这使得在字符串中使用引号变得更加容易。需要更少的插值并且没有反引号。
  2. 我不确定 $fileContent 的用途。但是,如果变量没有值,则在声明变量时不必设置值。事实上,最好不要。这样,如果未设置该值,您可以检测到它。我使用 $test_sequence_value 来保存设置的任何测试序列的值。现在习惯在 Perl 的变量名中使用下划线和小写字母以提高可读性,而不是 CamelCasing 变量(在所有其他编程语言中都是这样做的)。
  3. 此正则表达式正在查找后跟等号的字符串 TEST_SEQUENCE

    • ^ 将您的正则表达式锚定到行的开头。你不想# The following sets TEST_SEQUENCE =...被抓到。
    • \s* 是为了防止该字符串中有空格或制表符。 TEST_SEQUENCE = BasicTEST_SEQUENCE= BasicTEST_SEQUENCE=Basic.
    • 然后我查找字符串 TEST_SEQUENCE 后跟可选空格后跟 =.
    • (.*) 捕获该行的其余部分(省略可能的前缀空格。这会自动放入 </code> 变量中。</li> </ul></li> <li>在您的原始示例中,您不 return 从您的子例程中执行任何操作。我假设你想要 return 至少测试序列的值,所以我 return 那个(如果设置)。如果您正在做其他事情,我会使用 <code>if 语句。但是,整个 if 很容易成为 return $test_sequence_value;。如果 $test_sequence_value 未定义,它将 return 未定义,您可以测试它以查看是否找到它。