我正在研究一个Perl Dancer2 webapp,并偶然发现我有一个数组,其中包含位于第2位的数组的数组.我将对该数组的引用传递给sub,然后遍历数组(包含数组) ).
当我尝试将最里面的数组放入foreach()循环中时@$$_[2],我收到一个错误:
不是SCALAR参考
我可以轻松解决这个问题:
my $ref = $$_[2];
print "@$ref\n";
Run Code Online (Sandbox Code Playgroud)
但我想知道为什么第一种方法不起作用.
看看我的最小例子:
my @x = (["a", "b", [1, 2], "c"],
["x", "y", [8, 9], "z"]);
my $y = \@x;
foreach (@$y) {
# print "@$$_[2]\n"; #produces error
my $z = $$_[2];
print "@$z\n"; #works
}
Run Code Online (Sandbox Code Playgroud)
有什么想法在这里发生了什么?
我有一个存储std::vector东西的课程.在我的计划,我创建std::unordered_set的std::shared_ptr这个类的对象(见下面的代码).我定义了自定义函数来计算哈希值和相等性,以便unordered_set"使用"对象而不是指针.这意味着:对于具有相同内容的不同对象的两个不同指针应被视为相等,我们称之为"等效".
到目前为止,一切都按预期工作,但现在我偶然发现了一个奇怪的行为:我添加一个指向对象的指针,unordered_set并创建一个指向具有相同内容的不同对象的不同指针.如上所述,我希望它my_set.find(different_object)会将有效的迭代器返回到存储在集合中的等效指针.但事实并非如此.
这是一个最小的工作代码示例.
#include <boost/functional/hash.hpp>
#include <cstdlib>
#include <functional>
#include <iostream>
#include <memory>
#include <unordered_set>
#include <vector>
class Foo {
public:
Foo() {}
bool operator==(Foo const & rhs) const {
return bar == rhs.bar;
}
std::vector<int> bar;
};
struct FooHash {
size_t operator()(std::shared_ptr<Foo> const & foo) const {
size_t seed = 0;
for (size_t i = 0; i < foo->bar.size(); ++i) { …Run Code Online (Sandbox Code Playgroud)