Perl:字符串后双方括号的含义?

时间:2017-07-31 08:38:01

标签: perl square-bracket

我不理解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的每本初学者书中找到它。我无法在任何地方找到它

3 个答案:

答案 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;,这样可以解决代码中的任何问题。