我的branch_properties.txt
中有$ENV{"buildPath"}
个文件,其中包含字符串TEST_SEQUENCE=Basic
或TEST_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的控制台行输出什么都没有显示。
答案 0 :(得分:1)
尝试使用regexp:
my $variable;
if ($line =~ /TEST_SEQUENCE=(\w+)/){
$variable = $1;
}
答案 1 :(得分:0)
一些事情:
File::Spec
构建branch_properties.txt
文件的全名。 \\
不会在Unix系统上工作。$ENV{BuildPath}
测试验证-d
是否为有效目录。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;
}
以上的说明:
qq(...)
代替标准双引号。这样可以更轻松地在字符串中使用引号。需要更少的插值而无需引用。$fileContent
的用途。但是,如果变量没有值,则在声明变量时不必设置值。事实上,最好不要这样做。这样,如果未设置该值,则可以检测到它。我使用$test_sequence_value
来保存测试序列设置的值。现在可以自定义在Perl中使用变量名中的下划线和小写字母以获取可读性而不是CamelCasing变量(如在所有其他编程语言中所做的那样)。此正则表达式正在查找字符串TEST_SEQUENCE
,后跟等号。
^
将正则表达式锚定到行的开头。你不希望被# The following sets TEST_SEQUENCE =...
抓住。\s*
存在。
TEST_SEQUENCE = Basic
或TEST_SEQUENCE= Basic
或TEST_SEQUENCE=Basic
。TEST_SEQUENCE
,后跟可选空格,后跟=
。(.*)
捕获行的其余部分(省略可能的前缀空格。这会自动放入$1
变量。if
声明。但是,整个if
很容易return $test_sequence_value;
。如果$test_sequence_value
未定义,则会返回undefined,您可以测试它是否已找到。