对所有变量执行相同的操作,但在Perl函数中传递第一个变量

问题描述 投票:0回答:1

我正在使用Perl函数转储CSV文件,我传递了某些值,而且我想对这些传递的变量执行相同的操作,除了第一个变量,即文件句柄。我想要做的是检查传递的参数(string)中是否有逗号,如果是,请将它们用引号(")s括起来。

但是我需要将这些值分配给变量名称,因为我以后必须将它们用于不同的目的。

以下是我的子程序:

sub printCSVRowData
{
    my $CSVFileHandle = shift;

    foreach my $str (@_) {
        if ($str eq "" or not defined $str or $str =~ /^ *$/) {
            $str = "NA";
        }
        $str =~ s/\"//g;
    }

    my $firstCol = shift;
    my $secondCol = shift;
    my $thirdCol = shift;

    # Do some modifications

    print $CSVFileHandle "$firstCol, $secondCol, $thirdCol";
}

现在的问题是当我对这个子例程的值时,我收到以下错误信息:

在线上尝试修改只读值(调用$str =~ s/\"//g;)。

谁可以帮我这个事 ?我在这做错了什么?还有其他方法吗?

perl loops foreach arguments subroutine
1个回答
2
投票

您正在修改@_,其元素是作为参数传递的标量。因此,修改@_的元素并不安全。这就是我们复制@_元素和修改副本的原因。

sub printCSVRowData {
    my ($csv, $fh, @fields) = @_;
    @fields = map { defined($_) && /\S/ ? $_ : "NA" } @fields;
    $csv->say($fh, \@fields);
}

您应该使用Text :: CSV_XS或类似的。

my $csv = Text::CSV_XS->new({
    auto_diag => 2,
    binary    => 1,
});
© www.soinside.com 2019 - 2024. All rights reserved.