拆分字符串时访问元素
Access an element while splitting a string
我想检索数组的最后一个元素。 Array 是拆分后的字符串检索如下:
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...
是否可以直接获取最后一个元素?实现它的正确语法是什么?
查看 split()
的文档,我们看到:
Splits the string EXPR into a list of strings and returns the list in list context, or the size of the list in scalar context
所以我们可以得到数组中的列表:
my @net_info = split(/\//,'10.0.0.2/8');
然后获取该数组的最后一个元素:
my $cidr = $net_info[-1];
但是您可以使用 list slice 在一行代码中完成。列表切片的语法是:
( 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()
returns 列表中的元素数量 - 将为 2。并且“2”不是数组引用,所以你得到你看到的错误。
正确的语法是:
my $cidr = (split(/\//,'10.0.0.2/8'))[-1];
我想检索数组的最后一个元素。 Array 是拆分后的字符串检索如下:
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...
是否可以直接获取最后一个元素?实现它的正确语法是什么?
查看 split()
的文档,我们看到:
Splits the string EXPR into a list of strings and returns the list in list context, or the size of the list in scalar context
所以我们可以得到数组中的列表:
my @net_info = split(/\//,'10.0.0.2/8');
然后获取该数组的最后一个元素:
my $cidr = $net_info[-1];
但是您可以使用 list slice 在一行代码中完成。列表切片的语法是:
( 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()
returns 列表中的元素数量 - 将为 2。并且“2”不是数组引用,所以你得到你看到的错误。
正确的语法是:
my $cidr = (split(/\//,'10.0.0.2/8'))[-1];