我正在审查我们使用的Perl工具提供的供应商提供的补丁,我正在努力确定特定类型的更改的原因 - 传递给子例程的参数的'@'预先挂起.
例如,一行是:
my ($genfd) = @_;
Run Code Online (Sandbox Code Playgroud)
就是现在:
my ($genfd) = @@_;
Run Code Online (Sandbox Code Playgroud)
不是Perl开发人员,我在这里学习,但到目前为止,我知道'@_'是提供给封闭子程序的参数.
我也理解上面的赋值('$ genfd'包含在左侧的括号中)将'@_'强制转换为列表,然后将'genfd'标量变量赋给该列表的第一个元素.这应该导致子程序的第一个参数存储在'genfd'中.
我完全坚持的是第二个'@'的不同之处.我在GitHub上找到了这种用法的例子,但从未提供过解释,也无法找到任何Perl引用或SO的解释.任何帮助将非常感激.
看了这个问题,并且这个问题上的分歧my $var和my ($var),我仍然无法理解为什么数据::翻车机模块中从以下代码摘录使用括号.这些问题的答案中描述的差异似乎都不适用于此.
my($s) = {
level => 0, # current recursive depth
indent => $Indent, # various styles of indenting
# a bunch of other settings removed for brevity's sake
deparse => $Deparse, # use B::Deparse for coderefs
noseen => $Sparseseen, # do not populate the seen hash unless necessary
};
Run Code Online (Sandbox Code Playgroud)
我用一个小脚本测试了它,我觉得在声明这个my ($s)或者之间没有任何区别my $s.在这两种情况下,它都是哈希的标量引用,据我所知.
我错过了什么吗?
请帮助我理解以下片段:
my $count = @array;my @copy = @array;my ($first) = @array;(my $copy = $str) =~ s/\\/\\\\/g;my ($x) = f() or die;my $count = () = f();print($x = $y);print(@x = @y);我想知道是否有人可以解释之间的差异$name和($name).
例如:
my @objects = ('specs','books','apple');
my ($fruit) = grep { $_ eq 'apple'} @objects;
Run Code Online (Sandbox Code Playgroud)
这给出了结果$fruit = 'apple'.但是,如果将第二个语句修改为:
$fruit = grep { $_ eq 'apple'} @objects;
Run Code Online (Sandbox Code Playgroud)
水果的价值评估为1.这是相关/具体的grep吗?
我在子例程中使用@_来获取一个参数,该参数被指定为数组的引用,但结果不会显示为数组引用.
我的代码在下面.
my @aar = (9,8,7,6,5);
my $ref = \@aar;
AAR($ref);
sub AAR {
my $ref = @_;
print "ref = $ref";
}
Run Code Online (Sandbox Code Playgroud)
这将打印1,而不是数组引用,但如果我用shift替换@_,则打印结果将是引用.
任何人都可以解释为什么我不能使用@_给我一个参考?
有人可以向我解释为什么这是差异:
my $num = '>33*1311875297587*eval*0*frame[0]*"A"<' =~ /(\d{3,})/;
> $num = 1
my ($num) = '>33*1311875297587*eval*0*frame[0]*"A"<' =~ /(\d{3,})/;
> $num = 1311875297587
Run Code Online (Sandbox Code Playgroud)
我很好奇看到有什么恶作剧在等我.
谢谢
我将数据传递给子例程,但子例程没有返回正确的值.
test(5);
sub test {
my $t = @_;
return $t;
}
Run Code Online (Sandbox Code Playgroud)
它应该返回5但正在返回2.我正在使用Mojolicious,但我认为这不应该有所作为,因为它只是一个函数?
此脚本从下载的网页中删除网址.我在使用这个脚本时遇到了一些麻烦 - 当我使用它"my $csv_html_line = @_ ;"
然后打印出来时"@html_LineArray"- 它只是打印出来"1's".当我更换
"my $csv_html_line = @_ ;"使用"my $csv_html_line = shift ;"脚本工作正常.我不知道有什么不同之处"= @_" and shift- 因为我认为没有具体说明,在子程序中,转移从"@_".
#!/usr/bin/perl
use warnings;
use strict ;
sub find_url {
my $csv_html_line = @_ ;
#my $csv_html_line = shift ;
my @html_LineArray = split("," , $csv_html_line ) ;
print "@html_LineArray\n" ;
#foreach my $split_line(@html_LineArray) {
# if ($split_line =~ m/"adUrl":"(http:.*)"/) {
# my $url = $1;
# $url …Run Code Online (Sandbox Code Playgroud)