Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl获取参数数据类型_Perl - Fatal编程技术网

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中显示为一个大列表,所以在函数已经接受它之后,您无法区分标量列表、数组或散列。