【问题标题】:Perform the same operation to all the variables but first variable passed in a Perl function对所有变量执行相同的操作,但第一个变量传入 Perl 函数
【发布时间】:2018-03-05 08:02:05
【问题描述】:

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

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

以下是我的子程序:

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;)处修改只读值。

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

【问题讨论】:

  • 在您的foreach() 块内,您是否应该使用$elem 而不是$str

标签: perl loops foreach arguments subroutine


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 2014-08-12
    • 2021-08-03
    相关资源
    最近更新 更多