在 Perl 中解析文本文件并获取特定字符串
Parse text file in Perl and get a specific string
我的 $ENV{"buildPath"}
中有一个 branch_properties.txt
文件,其中包含字符串 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 中的控制台行输出没有任何显示。
尝试使用正则表达式:
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;
}
以及上面的注释:
- Perl 可以插入标量变量值。这样可以更轻松地阅读您正在打印的内容。此外,您可以使用
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
后跟可选空格后跟 =
.
(.*)
捕获该行的其余部分(省略可能的前缀空格。这会自动放入 </code> 变量中。</li>
</ul></li>
<li>在您的原始示例中,您不 return 从您的子例程中执行任何操作。我假设你想要 return 至少测试序列的值,所以我 return 那个(如果设置)。如果您正在做其他事情,我会使用 <code>if
语句。但是,整个 if
很容易成为 return $test_sequence_value;
。如果 $test_sequence_value
未定义,它将 return 未定义,您可以测试它以查看是否找到它。
我的 $ENV{"buildPath"}
中有一个 branch_properties.txt
文件,其中包含字符串 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 中的控制台行输出没有任何显示。
尝试使用正则表达式:
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;
}
以及上面的注释:
- Perl 可以插入标量变量值。这样可以更轻松地阅读您正在打印的内容。此外,您可以使用
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
后跟可选空格后跟=
. (.*)
捕获该行的其余部分(省略可能的前缀空格。这会自动放入</code> 变量中。</li> </ul></li> <li>在您的原始示例中,您不 return 从您的子例程中执行任何操作。我假设你想要 return 至少测试序列的值,所以我 return 那个(如果设置)。如果您正在做其他事情,我会使用 <code>if
语句。但是,整个if
很容易成为return $test_sequence_value;
。如果$test_sequence_value
未定义,它将 return 未定义,您可以测试它以查看是否找到它。