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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对所有变量执行相同的操作,但在Perl函数中传递第一个变量相关的知识,希望对你有一定的参考价值。

我正在使用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;)。

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

答案

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

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

以上是关于对所有变量执行相同的操作,但在Perl函数中传递第一个变量的主要内容,如果未能解决你的问题,请参考以下文章

Apache 未在包含的 perl 脚本中执行“do”包含函数

Perl 变量范围问题

想要在 PHP 中传递值列表(如在 Perl 中),而不是引用数组

在 PHP 和 Perl 之间传递大量数据

typescript:传递一个接受较少参数的函数 - 如何为传递的函数强制执行相同数量的参数

kettle作业 循环执行并行执行作业