Perl特殊变量"@_&引用;在子例程中不工作

Perl特殊变量"@_&引用;在子例程中不工作,perl,subroutine,special-variables,Perl,Subroutine,Special Variables,此脚本从下载的网页中删除URL。我在使用这个脚本时遇到了一些问题-当我使用“my$csv\u html\u line=@\u;” 然后打印出“@html\u LineArray”——它只打印出“1”。当我更换 “my$csv\u html\u line=@;”与“my$csv\u html\u line=shift;”脚本工作正常。 我不知道“=@u”和shift之间有什么区别,因为我认为 在不指定任何内容的情况下,在子例程中,从s“@”移位 这工作正常-它使用shift而不是“@” #/usr

此脚本从下载的网页中删除URL。我在使用这个脚本时遇到了一些问题-当我使用
“my$csv\u html\u line=@\u;”
然后打印出
“@html\u LineArray”
——它只打印出
“1”
。当我更换
“my$csv\u html\u line=@;”
“my$csv\u html\u line=shift;”
脚本工作正常。 我不知道
“=@u”和shift
之间有什么区别,因为我认为 在不指定任何内容的情况下,在子例程中,从s
“@”移位

这工作正常-它使用shift而不是“@”

#/usr/bin/perl
使用警告;
严格使用;
子查找url{
#我的$csv_html_行=@;
我的$csv\u html\u行=shift;
my@html\u LineArray=split(“,”,$csv\u html\u line);
#打印“@html\u LineArray\n”;
每个我的$split\u行(@html\u LineArray){
如果($split_line=~m/“adUrl”:(http:.*/){
我的$url=$1;
$url=~tr/\\//d;
打印(“$url\n”);
}
}
}
我的$local_文件=“@ARGV”;
打开(我的$fh,它是

您编写代码的方式是在标量上下文中计算
@
,并获得其长度(元素数)。正如您所指出的

my $csv_html_line = shift;
之所以有效,是因为
shift
运算符获取一个列表,并删除并返回第一个元素作为标量。

您需要

my ($csv_html_line) = @_ ;

由于将数组分配给标量将返回其长度(即1和一个参数)

如果我在特殊变量-my$csv\u html\u line=“@”周围加上双引号会怎么样“为什么要这样做?您认为可以实现什么?如果
@
包含多个字符串,引用它将返回所有串联的成员字符串,以空格分隔。可能不是您想要的。引用特殊变量将把整个数组打印到标量,然后标量可以用逗号分割,然后放在另一个数组中。你没有逗号,只有空格。为什么还要经历连接然后再次拆分的麻烦呢?它已经很好地为你拆分了。你真的应该在命令行调试器中尝试类似的东西:
perl-de0
#!/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 =~ tr/\\//d;
            print("$url\n")  ;
        }
    }
}



my $local_file = "@ARGV" ;
open(my $fh, '<', "$local_file") or die "cannot open up the $local_file $!" ;
while( my $html_line = <$fh>) {
    #print "$html_line\n";
    find_url($html_line) ;
}
my ($csv_html_line) = @_ ;
my $csv_html_line = shift;
my ($csv_html_line) = @_ ;