使用 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. 截去冒号前后各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 );

这个应该可以胜任::(?=~)

Demo

也许矫枉过正,但我​​会使用

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