使用 ref 验证 perl 构造函数中的初始化变量
validating initialization variables in perl constructor using ref
我正在尝试使用正则表达式对仅存在 1 个冒号 (:) 的字符串应用拆分函数。问题是虽然冒号可以连续多次存在,但我只对冒号前面或后面没有另一个冒号的情况感兴趣。任何其他字符都可以在冒号之前或之后。
示例字符串:
my $example_string = "_Fruit|Apple:~Vegetable|Carrot:~fruitfunc|Package::User::Today:~datefunct|{~date}"
预期结果:
my @result_array = ["_Fruit|Apple","~Vegetable|Carrot","~fruitfunc|Package::User::Today","~datefunct|{~date}"];
到目前为止我尝试的是否定和组正则表达式的组合...一个让我接近的例子:
截去冒号前后各1个值
my @result_array= split(/[^:][:][^:]/g, $example_string )
@result_array = [
'_targetfund|tes',
'rowcountmax|10',
'test|YE',
'fruit|appl',
'date|\'12/31/2016\''
];
我在玩 https://regex101.com/,我想也许有一种方法可以在同一个正则表达式中 return $1 或可以递归完成的东西。
任何帮助将不胜感激
您可以使用环视断言,即按分号拆分,分号前后均不分号:
#!/usr/bin/perl
use warnings;
use strict;
use Test::Deep;
my $example_string = "_Fruit|Apple:~Vegetable|Carrot:~fruitfunc|Package::User::Today:~datefunct|{~date}";
my $result_array = ["_Fruit|Apple","~Vegetable|Carrot","~fruitfunc|Package::User::Today","~datefunct|{~date}"];
cmp_deeply( [ split /(?<!:):(?!:)/, $example_string ], $result_array );
这个应该可以胜任::(?=~)
也许矫枉过正,但我会使用
split /(?<!:):(?!:)/, $str;
演示
use 5.014;
use warnings;
use Test::More;
my $str = "_Fruit|Apple:~Vegetable|Carrot:~fruitfunc|Package::User::Today:~datefunct|{~date}";
my @wanted = ("_Fruit|Apple","~Vegetable|Carrot","~fruitfunc|Package::User::Today","~datefunct|{~date}");
my @arr = split /(?<!:):(?!:)/, $str;
is_deeply(\@arr, \@wanted);
done_testing(1);
#ok 1
#1..1
我正在尝试使用正则表达式对仅存在 1 个冒号 (:) 的字符串应用拆分函数。问题是虽然冒号可以连续多次存在,但我只对冒号前面或后面没有另一个冒号的情况感兴趣。任何其他字符都可以在冒号之前或之后。
示例字符串:
my $example_string = "_Fruit|Apple:~Vegetable|Carrot:~fruitfunc|Package::User::Today:~datefunct|{~date}"
预期结果:
my @result_array = ["_Fruit|Apple","~Vegetable|Carrot","~fruitfunc|Package::User::Today","~datefunct|{~date}"];
到目前为止我尝试的是否定和组正则表达式的组合...一个让我接近的例子:
截去冒号前后各1个值
my @result_array= split(/[^:][:][^:]/g, $example_string ) @result_array = [ '_targetfund|tes', 'rowcountmax|10', 'test|YE', 'fruit|appl', 'date|\'12/31/2016\'' ];
我在玩 https://regex101.com/,我想也许有一种方法可以在同一个正则表达式中 return $1 或可以递归完成的东西。
任何帮助将不胜感激
您可以使用环视断言,即按分号拆分,分号前后均不分号:
#!/usr/bin/perl
use warnings;
use strict;
use Test::Deep;
my $example_string = "_Fruit|Apple:~Vegetable|Carrot:~fruitfunc|Package::User::Today:~datefunct|{~date}";
my $result_array = ["_Fruit|Apple","~Vegetable|Carrot","~fruitfunc|Package::User::Today","~datefunct|{~date}"];
cmp_deeply( [ split /(?<!:):(?!:)/, $example_string ], $result_array );
这个应该可以胜任::(?=~)
也许矫枉过正,但我会使用
split /(?<!:):(?!:)/, $str;
演示
use 5.014;
use warnings;
use Test::More;
my $str = "_Fruit|Apple:~Vegetable|Carrot:~fruitfunc|Package::User::Today:~datefunct|{~date}";
my @wanted = ("_Fruit|Apple","~Vegetable|Carrot","~fruitfunc|Package::User::Today","~datefunct|{~date}");
my @arr = split /(?<!:):(?!:)/, $str;
is_deeply(\@arr, \@wanted);
done_testing(1);
#ok 1
#1..1