Perl获取参数数据类型
我试图创建一个子例程,根据数据类型替换数据:问题是我无法获取参数的数据类型,我使用了以下方法:Perl获取参数数据类型,perl,Perl,我试图创建一个子例程,根据数据类型替换数据:问题是我无法获取参数的数据类型,我使用了以下方法: sub replace { my ($search, $replacement, $subject) = @_; if (ref($search) eq "HASH") { print "r is a reference to a HASH.\n"; } elsif (ref($search) eq "SCALAR") {
sub replace {
my ($search, $replacement, $subject) = @_;
if (ref($search) eq "HASH") {
print "r is a reference to a HASH.\n";
}
elsif (ref($search) eq "SCALAR") {
print "r is a reference to a SCALAR.\n";
}
elsif (ref($search) eq "ARRAY") {
print "r is a reference to a ARRAY.\n";
}
}
my $str = "Foo";
my @arr = ("Foo");
replace($str);
replace(@arr);
但这一切都不管用。我对perl真的很陌生引用的是某物,而不是某物本身。在这里:
replace($str);
replace(@arr);
…你是在直接发送一些东西。通过在某物前面放置一个\
来发送对该某物的引用(表示“引用该某物”):
输出:
r is a reference to a SCALAR.
r is a reference to a ARRAY.
还要注意,在replace()
函数中,这一行:
my ($search, $replacement, $subject) = @_;
您实际上是在请求一个标量值作为搜索对象,因此如果传入的列表中有多个元素,那么传入列表(数组、哈希等)将导致$replacement
和$subject
,因此您可能需要执行类似操作以确保获得正确的参数,而且没有什么意外的失败:
sub replace {
my ($search, $replacement, $subject) = @_;
die "first arg must be a ref\n" if ! ref $search;
当然,您可以进行进一步的参数检查,但这将确保第一个参数只能是对某个对象的引用。除了die()
,您还可以只返回
,这样程序就不会崩溃,或者打印
或警告
,然后返回
引用某个对象,而不是对象本身。在这里:
replace($str);
replace(@arr);
…你是在直接发送一些东西。通过在某物前面放置一个\
来发送对该某物的引用(表示“引用该某物”):
输出:
r is a reference to a SCALAR.
r is a reference to a ARRAY.
还要注意,在replace()
函数中,这一行:
my ($search, $replacement, $subject) = @_;
您实际上是在请求一个标量值作为搜索对象,因此如果传入的列表中有多个元素,那么传入列表(数组、哈希等)将导致$replacement
和$subject
,因此您可能需要执行类似操作以确保获得正确的参数,而且没有什么意外的失败:
sub replace {
my ($search, $replacement, $subject) = @_;
die "first arg must be a ref\n" if ! ref $search;
当然,您可以进行进一步的参数检查,但这将确保第一个参数只能是对某个对象的引用。除了
die()
,您还可以只返回
,这样程序就不会崩溃,或者打印
或警告
,然后返回
虽然没有说明您想用它做什么,但您显示的内容有什么问题
函数显示提交给它的引用的数据类型,或者如果其参数根本不是引用,则返回空字符串
因此,要获得预期的行为,您应该执行以下操作
replace(\$str);
replace(\@arr);
此外,还需要将测试添加到函数中
else (not ref $search)
用于当提交的字符串不是引用时
为了完整起见,我还应该指出一个问题,在回答中解释为。当您将数组传递给函数时,它将作为参数的平面列表接收该数组。对于您的功能,您显然不希望
替换(@arr)
。它们按顺序分配给标量变量列表,每个变量分配一个元素。(只要有一个数组变量,它就会全部进入其中。)例如,请参见。没有说明要对它执行什么操作,但下面是显示内容的错误之处
函数显示提交给它的引用的数据类型,或者如果其参数根本不是引用,则返回空字符串
因此,要获得预期的行为,您应该执行以下操作
replace(\$str);
replace(\@arr);
此外,还需要将测试添加到函数中
else (not ref $search)
用于当提交的字符串不是引用时
为了完整起见,我还应该指出一个问题,在回答中解释为。当您将数组传递给函数时,它将作为参数的平面列表接收该数组。对于您的功能,您显然不希望
替换(@arr)
。它们按顺序分配给标量变量列表,每个变量分配一个元素。(只要有一个数组变量,它就会全部进入其中。)例如,请参见。除了向其中添加\之外,还有其他方法吗?像我可以在子例程中这样做吗?@ChrysUgwu否,因为函数参数在perl看来是一个大列表,所以在函数已经接受它之后,您无法区分标量列表、数组或散列。除了向其中添加\之外,还有其他方法吗?像我可以在子例程中这样做吗?@ChrysUgwu否,因为函数参数在perl中显示为一个大列表,所以在函数已经接受它之后,您无法区分标量列表、数组或散列。