我试图创建一个根据数据类型替换数据的子例程:问题是我无法获取参数的数据类型,我使用了这个:
DBD::Oracle::st fetchrow_array failed: ERROR no statement executing (perhaps you need to call execute first)
但没有效果。我真的很新perl
答案 0 :(得分:3)
ref()将引用带入某个东西,而不是某些东西本身。这里:
replace($str);
replace(@arr);
...你直接寄送东西。通过在其前面加上\
来发送对某事物的引用(其中说明了"引用了这个内容"):
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()
取代return
,而不是{* 1}}或print
然后warn
。
答案 1 :(得分:1)
没有说明你想用它做什么,但是这里显示的是什么错误。
ref函数显示引用的数据类型,如果其参数根本不是引用,则返回空字符串。
所以要做到你应该做的预期行为
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:3
#EXTINF:2.033333,
media00000.ts
#EXTINF:2.000000,
media00001.ts
#EXTINF:2.000000,
media00002.ts
#EXTINF:2.000000,
media00003.ts
#EXTINF:2.000000,
media00004.ts
#EXTINF:2.000000,
media00005.ts
#EXTINF:2.000000,
media00006.ts
#EXTINF:2.000000,
media00007.ts
#EXTINF:2.000000,
media00008.ts
#EXTINF:2.000000,
media00009.ts
#EXTINF:0.033333,
media00010.ts
#EXT-X-ENDLIST
此外,您需要将测试添加到您的功能
replace(\$str);
replace(\@arr);
表示提交的字符串不是引用。
为了完整起见,我还应该指出一个问题,在stevieb的答案中解释。将数组传递给函数时,它会将其作为参数的平面列表接收。使用您的功能,您显然不希望else (not ref $search)
。它们按顺序分配给标量变量列表,每个变量一个元素。 (只要有一个数组变量,它就会进入它。)例如,参见this post。