对所有变量执行相同的操作,但在 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,
});
我正在使用 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,
});