gpt4 book ai didi

Perl qr//操作

转载 作者:行者123 更新时间:2023-12-04 22:32:34 28 4
gpt4 key购买 nike

我有一个关于 Perl qr 运算符的问题:

#!/usr/bin/perl -w
&mysplit("a:b:c", /:/);
sub mysplit {
my($str, $pattern) = @_;
my @arr = split $pattern, $str;
print "@arr\n";
}


结果是:

Use of uninitialized value $_ in pattern match (m//) at ./test.pl line 3.
Use of uninitialized value $pattern in regexp compilation at ./test.pl line 7.



但是当我使用: &mysplit("a:b:c", qr/:/); 时,就可以了。
所以,我想知道 qr//m// 之间有什么区别?
为什么 $_ 在这里相关?
为什么在 split /:/, "a:b:c"; 的情况下没问题?

先感谢您!

最佳答案

好吧,你的问题是这个表达式:

/:/

真正的意思是:
$_ =~ /:/

这就是 perl 在 $_ 上报告未初始化错误的原因。
qr() 操作符没有这个快捷方式,这就是为什么在这种情况下它本身是一个可接受的语句。

所以,要清楚:你的陈述:
&mysplit("a:b:c", /:/);

真正的意思是:
&mysplit("a:b:c", $_ =~ /:/);

由于 $_ 未定义,正则表达式匹配返回空列表。它可能返回空字符串,但由于您有列表上下文,它返回空列表,使错误更加明显。

因为它返回空列表,所以只有一个参数传递给 mysplit() ,这就是您收到第二个警告的原因:
Use of uninitialized value $pattern in regexp compilation at ./test.pl line 7.

如果传递了空字符串,则该部分错误将被忽略。

此外,您应该知道在子程序调用前使用&符号 & 具有特定功能。除非您打算使用该功能,否则不应使用它。调用 sub 的各种方法如下,如 perldoc perlsub 中所述:
NAME(LIST);  # & is optional with parentheses.
NAME LIST; # Parentheses optional if predeclared/imported.
&NAME(LIST); # Circumvent prototypes.
&NAME; # Makes current @_ visible to called subroutine.

默认方式是最上面的,在你的情况下: mysplit(...)

关于Perl qr//操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16831848/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com