sách gpt4 ai đã đi

Perl qr//操作

In lại 作者:行者123 更新时间:2023-12-04 22:32:34 29 4
mua khóa gpt4 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// 之间有什么区别?
Tại sao $_ 在这里相关?
为什么在 split /:/, "a:b:c"; 的情况下没问题?

先感谢您!

1 Câu trả lời

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

/:/

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

这就是 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 Như đã nêu trong:
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/

29 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com