使用 ref 验证 Perl 构造函数中的初始化变量



我正在尝试仅在字符串上应用拆分函数,其中 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/,认为也许有一种方法可以在同一个正则表达式中返回 1 美元或可以递归完成的东西。

任何帮助将不胜感激

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

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

您可以使用环顾四周的断言,即在分号之前或后面不带分号的分号上拆分:

#!/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 );

这个应该做这项工作::(?=~)

演示

最新更新