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

Perform the same operation to all the variables but first variable passed in a Perl function

我正在使用 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";
}

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

Modification of a read-only value attempted at line (where $str =~ s/\"//g; is called).

谁能帮我解决这个问题?我在这里做错了什么?还有其他解决方法吗?

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

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,
});