我不理解Perl中看似基本的代码片段,如下所示:
select t.* ,
s.skills,s.skills_id
FROM `candidates` `t`
join
(
select t.id tid, group_concat(s.name) skills, group_concat(s.id order by s.id) skills_id
FROM `candidates` `t`
LEFT JOIN `candidate-skills` `cs` ON `t`.`id` = `cs`.`can_id`
LEFT JOIN `skills` `s` ON `cs`.`skill_id` = `s`.`id`
group by t.id
) s
on s.tid = t.id
where instr(skills_id,'8,10') > 0
+----+----------------+---------------------+-------------+------------+-------------------------------------------+-------------+
| id | name | created_on | modified_on | is_deleted | skills | skills_id |
+----+----------------+---------------------+-------------+------------+-------------------------------------------+-------------+
| 1 | Eugine | 2017-05-23 11:44:30 | NULL | N | zend framework 2,bootstrap,wordpress | 8,10,12 |
| 2 | Frinoy Francis | 2017-05-23 16:44:29 | NULL | N | html,html5,zend framework 2,php,bootstrap | 1,4,8,10,11 |
+----+----------------+---------------------+-------------+------------+-------------------------------------------+-------------+
2 rows in set (0.03 sec)
MariaDB [sandbox]> select t.* ,
-> s.skills,s.skills_id
-> FROM `candidates` `t`
-> join
-> (
-> select t.id tid, group_concat(s.name) skills, group_concat(s.id order by s.id) skills_id
-> FROM `candidates` `t`
-> LEFT JOIN `candidate-skills` `cs` ON `t`.`id` = `cs`.`can_id`
-> LEFT JOIN `skills` `s` ON `cs`.`skill_id` = `s`.`id`
-> group by t.id
-> ) s
-> on s.tid = t.id
-> where instr(skills_id,'') > 0
-> ;
+----+----------------+---------------------+-------------+------------+-------------------------------------------+-------------+
| id | name | created_on | modified_on | is_deleted | skills | skills_id |
+----+----------------+---------------------+-------------+------------+-------------------------------------------+-------------+
| 1 | Eugine | 2017-05-23 11:44:30 | NULL | N | zend framework 2,bootstrap,wordpress | 8,10,12 |
| 2 | Frinoy Francis | 2017-05-23 16:44:29 | NULL | N | html,html5,zend framework 2,php,bootstrap | 1,4,8,10,11 |
| 3 | Arun | 2017-05-28 12:56:24 | NULL | N | bootstrap | 8 |
+----+----------------+---------------------+-------------+------------+-------------------------------------------+-------------+
3 rows in set (0.03 sec)
双方括号的含义是什么?
我很抱歉,如果已经提出这个或者是如此基本的话,可以在Perl的每本初学者书中找到它。我无法在任何地方找到它
答案 0 :(得分:1)
这意味着您正在使用二维数组。
#!/usr/bin/env perl
use strict;
use warnings;
my @stuff = (
[ 1, 2, 3, 4 ],
[ 5, 6, 7, 8 ],
);
print $stuff[1][2];
#prints '7'
答案 1 :(得分:1)
这意味着你所拥有的不是"一个字符串"。它是一个名为@line
的数组,@line
中的每个元素都是对另一个数组的引用。
当您访问Perl数组中的单个元素时,sigil会从@
(这意味着多个值)更改为$
(这意味着单个值)。因此,要在名为$k
的数组中查找索引为@line
的元素,请使用:
$line[$k]
但在您的示例中,$line[$k]
包含对另一个数组的引用。要从数组引用获取引用数组的其中一个元素,我们使用->[...]
语法。因此$k
的{{1}}元素引用的数组的第二个元素由下式给出:
@line
在Perl中,我们有一个规则,当两组数组(或哈希)查找括号仅由一个解除引用数组分隔时,我们可以省略该箭头。所以我之前的例子可以简化为:
$line[$k]->[1];
答案 2 :(得分:0)
[..]
是一个数组索引。如果你有2个,这意味着它是一个阵列数组。在您的示例中,您将获得$k
的{{1}}元素的第二个元素(索引从0开始)。
你认为它是一个字符串可能是一个标志,代码写得不好,因为应该有一行代表@line
确保代码顶部有my @line;
和use strict;
,这样可以解决代码中的任何问题。