我有一个对象数组,以及一个特定方法的可接受返回值数组.如何将对象数组减少到只有那些方法在我的可接受值数组中返回值的对象?
现在,我有这个:
my @allowed = grep {
my $object = $_;
my $returned = $object->method;
grep {
my $value = $_;
$value eq $returned;
} @acceptableValues;
} @objects;
Run Code Online (Sandbox Code Playgroud)
问题是这是一个复合循环,我想避免.该程序旨在扩展到任意大小,我想最小化运行的迭代次数.
最好的方法是什么?
我的脚本中有以下几行:
my $spec = shift;
if (!defined $spec) {
return ("Invalid specification", undef);
}
$spec = "$spec" // '';
Run Code Online (Sandbox Code Playgroud)
我自然希望这会在传递undef时返回Invalid specification数组中的警告,第二项是undef.相反,检查通过,我得到一个控制台消息警告我Use of uninitialized value $spec in string下一行.
$spec是一个带有字符串和数字重载的对象,不幸的是这样写入,试图在这个特定子程序中测试真实性(if ($spec)例如),导致深度递归和段错误.
虽然我很感兴趣,为什么,到底,发生这种情况,我更感兴趣的是如何使它停止发生.我想消除控制台警告,最好没有no warnings qw/uninitialized/.这是可能的,如果是的话,我该怎么做?
我正在抓取一个网页,并从中提取一个特定的部分.该部分包括引号(’,字符146).我正在尝试将提取的数据打印到文本文件中,但是它给了我’而不是反转的逗号.我尝试过以下方法:
$content =~ s/’/'/g;my $invComma = chr 146;
$content =~ s/$invComma/'/g;$content =~ s/\x{0092}/'/g;它都没有奏效.我不能,decode('UTF-8', $content)因为它有广泛的人物.当我尝试encode('UTF-8', $content)的’改变’来代替.我已经尝试use utf8过,没有效果.
我知道我的文本文件查看器可以显示引号,因为我将一个打印到测试文件并打开它.因此问题在我的脚本中.
我做错了什么,我该如何解决?
更新:我能够$content =~ s/’/'/g用简单的撇号替换它,但我仍然不知道为什么没有其他工作.我也想要一个能够解决问题的解决方案,而不仅仅是解决其中一个症状.
更新2:我被hobbs告知,这个角色实际上已经U+2019 RIGHT SINGLE QUOTATION MARK改变了我的正则表达式chr 0x2019,现在可以使用了.