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

时间:2015-01-16 08:59:10

标签: perl

我的branch_properties.txt中有$ENV{"buildPath"}个文件,其中包含字符串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的控制台行输出什么都没有显示。

2 个答案:

答案 0 :(得分:1)

尝试使用regexp:

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

答案 1 :(得分:0)

一些事情:

  • 使用File::Spec构建branch_properties.txt文件的全名。 \\不会在Unix系统上工作。
  • 使用$ENV{BuildPath}测试验证-d是否为有效目录。
  • 我试图理解你提出的问题和程序。我无法看到你如何寻找特定的线条,然后拿出你想要的价值。
  • 你是什么意思&#34; Jenkins中的控制台行输出什么都没有显示&#34; ?你的意思是詹金斯不是在建造吗?你看Jenkins正在做什么,但是当你运行时你看不到任何输出?您可以添加一些warn语句来打印出您的位置吗?詹金斯说构建失败了吗?

这是您的计划,只需进行一些修改:

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 = $1;
        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,后跟可选空格,后跟=
    • (.*)捕获行的其余部分(省略可能的前缀空格。这会自动放入$1变量。
  4. 在您的原始示例中,您不会从子例程返回任何内容。我假设你想要至少返回测试序列的值,所以我返回(如果设置)。如果您正在做其他事情,我会使用if声明。但是,整个if很容易return $test_sequence_value;。如果$test_sequence_value未定义,则会返回undefined,您可以测试它是否已找到。