Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Perl单元测试:检查字符串是否是数组_Arrays_Perl_Unit Testing - Fatal编程技术网

Arrays Perl单元测试:检查字符串是否是数组

Arrays Perl单元测试:检查字符串是否是数组,arrays,perl,unit-testing,Arrays,Perl,Unit Testing,我有一个要测试的函数: use constant NEXT => 'next'; use constant BACK => 'back'; sub getStringIDs { return [ NEXT, BACK ]; } 我尝试编写以下测试,但失败了: subtest 'check if it contains BACK' => sub { use constant BACK => 'back';

我有一个要测试的函数:

use constant NEXT => 'next';
use constant BACK => 'back';

sub getStringIDs {
    return [
        NEXT,
        BACK
    ];
}
我尝试编写以下测试,但失败了:

subtest 'check if it contains BACK' => sub {
    use constant BACK => 'back';
    my $strings = $magicObject->getStringIDs();
    ok($strings =~ /BACK/);
}

我做错了什么?

magicObject->getStringIDs的返回值是数组引用,而不是字符串。看起来您测试的目的是检查数组模式中是否至少有一个元素与
BACK
匹配。执行此操作的方法是通过解引用数组
grep
,并检查是否存在非零个匹配项

ok( grep(/BACK/,@$strings) != 0, 'contains BACK' );

有一段时间,政府承诺会解决这个问题

ok( $strings ~~ /BACK/ )
但是它已经并且应该小心使用(并且
无警告'experimental::smartmatch'
pragma)。

您的
getStringIDs()
方法返回数组引用

正则表达式绑定运算符(
=~
)需要在其左侧有一个字符串。因此,它将数组引用转换为字符串。字符串化的数组引用类似于
数组(0x1ff4a68)
。它不会提供数组的任何内容

通过取消对数组的引用(
@$strings
),您可以从数组引用(
@$strings
)获取该数组。您可以通过将数组放在双引号(
“@$strings”
)中对其进行字符串化

所以你可以这样做:

ok("@$strings" =~ /BACK/);
但我怀疑,你想在里面放单词边界标记:

ok("@$strings" =~ /\bBACK\b/);
您也可能更喜欢
like()
测试函数

like("@$strings", qr[\bBACK\b], 'Strings array contains BACK');
更新:另一种选择是使用
grep
检查数组元素之一是否为字符串“BACK”

更新2:嗯。。。在这里使用常量的事实使这变得复杂。常量是子例程,正则表达式是字符串,子例程不在字符串中插入。

是您的朋友

use Test::More;
use syntax 'in';

use constant NEXT => 'next';
use constant BACK => 'back';

ok BACK |in| [NEXT, BACK], 'BACK is in the arrayref';
done_testing;

为什么在测试中也定义了常数?你想用它实现什么?@simbabque:我猜它们在不同的文件中,并且没有正确导出。@DaveCross我觉得他们想在正则表达式中使用它。我想他们甚至不知道他们可以导出它们。@simbabque:似乎有可能。我可以问你为什么使用
“@$strings”
,而不仅仅是
@$strings
(没有引号)?还有,为什么在
$\eq'BACK'
中使用引号使用
$strings
将所有元素一起运行(
NEXTBACK
),而
“@strings”
在元素之间放置空格(
下一步
)。这允许我们使用
\b
查找单个单词。否则,如果数组中包含“FEB”和“ACK”,我们可能会遇到麻烦。@Dave代码中的引号与我对您的问题的评论有关。当您使用
m/BACK/
时,返回的是字符串,而不是函数调用(常量只不过是Perl中的函数)。Perl无法在字符串中插入函数调用。您可能应该提到,它们需要安装和模块。
use Test::More;
use syntax 'in';

use constant NEXT => 'next';
use constant BACK => 'back';

ok BACK |in| [NEXT, BACK], 'BACK is in the arrayref';
done_testing;