子例程中的Perl特殊变量“@_”不起作用

时间:2016-02-22 03:24:43

标签: perl subroutine special-variables

此脚本会从下载的网页中删除网址。我在使用"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 =~ 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) ;
}

以上是打印出的内容。

1
1
1
1
1
1
1
1
1
1
1
1

这很好用 - 它使用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 =~ 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) ;
}

2 个答案:

答案 0 :(得分:6)

它的

my ($csv_html_line) = @_ ;

您在标量上下文中编写您评估的代码@_并获得其长度(元素数)的方式。如你所说,

my $csv_html_line = shift;

有效,因为shift运算符接受一个列表并删除并将第一个元素作为标量返回。

答案 1 :(得分:2)

你需要

my ($csv_html_line) = @_ ;

将数组赋给标量将返回其长度(使用一个参数为1)