【问题标题】:Access an element while splitting a string在拆分字符串时访问元素
【发布时间】:2023-03-23 18:34:01
【问题描述】:

我想检索数组的最后一个元素。数组是一个拆分后的字符串,检索方式如下:
my @net_info = split(/\//,'10.0.0.2/8');

我只对数组的最后一个元素感兴趣,即一行中的 CIDR 值。我在想:
my $cidr = ${split(/\//,'10.0.0.2/8')}[-1];

但结果是:
Can't use string ("2") as an ARRAY ref while "strict refs" in use at...

是否可以直接获取最后一个元素?实现它的正确语法是什么?

【问题讨论】:

    标签: arrays perl variable-assignment


    【解决方案1】:

    查看split() 的文档,我们看到:

    将字符串 EXPR 拆分为字符串列表,并在列表上下文中返回列表,或在标量上下文中返回列表的大小

    所以我们可以得到一个数组中的列表:

    my @net_info = split(/\//,'10.0.0.2/8');
    

    然后获取该数组的最后一个元素:

    my $cidr = $net_info[-1];
    

    但是您可以通过使用 列表切片 在一行代码中完成。列表切片的语法是:

    ( LIST )[ INDEX ]
    

    你有点迷路了,用这个:

    ${ LIST }[ INDEX ]
    

    所以你的问题的正确语法是:

    my $cidr = ( split(/\//,'10.0.0.2/8') )[-1];
    

    此外,如果您对作为 split() 的第一个参数的正则表达式使用不同的分隔符,您的代码可能会更容易理解 - 从而无需转义斜杠。

    my $cidr = ( split(m[/],'10.0.0.2/8') )[-1];
    

    更新:鉴于网络掩码只包含一个斜杠,编写如下内容可能更容易:

    my ($ip, $cidr) = split(m[/], '10.0.0.2/8');
    

    或者(使用undef删除split()返回的第一个值:

    my (undef, $cidr) = split(m[/], '10.0.0.2/8');
    

    更新 2: 并解释您的原始代码中发生了什么。你无意中使用了这个结构:

    ${ ARRAYREF }[ INDEX ]
    

    当您只有对数组的引用时,这是获取数组元素值的一种方法的通用版本(当然,更常见的是使用ARRAYREF->[ INDEX ])。

    由于${ ... } 中的表达式预计会计算为数组引用,并且数组引用总是标量值,Perl 会在标量上下文中计算表达式。正如我们从上面的文档摘录中看到的那样,在标量上下文中,split() 返回列表中元素的数量 - 这将是 2。并且“2”不是数组引用,因此您会得到错误见过。

    【讨论】:

    • 立即清除 :) 所有示例都已注明!谢谢!
    【解决方案2】:

    正确的语法是:

    my $cidr = (split(/\//,'10.0.0.2/8'))[-1];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 2015-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多