我在使用Perl的内置分割功能时遇到了一些麻烦.我正在创建一个脚本,用于编辑CSV文件的第一行,该文件使用管道进行列分隔.以下是第一行:
KEY|H1|H2|H3
Run Code Online (Sandbox Code Playgroud)
但是,当我运行脚本时,这是我收到的输出:
Col1|Col2|Col3|Col4|Col5|Col6|Col7|Col8|Col9|Col10|Col11|Col12|Col13|
Run Code Online (Sandbox Code Playgroud)
我有一种感觉,Perl不喜欢我使用变量实际进行拆分的事实,在这种情况下,变量是一个管道.当我用实际管道替换变量时,它按预期完美地工作.当使用管道定界时,即使传入变量,我怎么能正确分割线?另外,作为一个愚蠢的警告,我没有权限从CPAN安装外部模块,所以我必须坚持内置的功能和模块.
对于上下文,这是我的脚本的必要部分:
our $opt_h;
our $opt_f;
our $opt_d;
# Get user input - filename and delimiter
getopts("f:d:h");
if (defined($opt_h)) {
&print_help;
exit 0;
}
if (!defined($opt_f)) {
$opt_f = &promptUser("Enter the Source file, for example /qa/data/testdata/prod.csv");
}
if (!defined($opt_d)) {
$opt_d = "\|";
}
my $delimiter = "\|";
my $temp_file = $opt_f;
my @temp_file = split(/\./, $temp_file);
$temp_file = $temp_file[0]."_add-headers.".$temp_file[1];
open(source_file, "<", $opt_f) or die "Err opening $opt_f: $!";
open(temp_file, ">", $temp_file) or die "Error opening $temp_file: $!";
my $source_header = <source_file>;
my @source_header_columns = split(/${delimiter}/, $source_header);
chomp(@source_header_columns);
for (my $i=1; $i<=scalar(@source_header_columns); $i++) {
print temp_file "Col$i";
print temp_file "$delimiter";
}
print temp_file "\n";
while (my $line = <source_file>) {
print temp_file "$line";
}
close(source_file);
close(temp_file);
Run Code Online (Sandbox Code Playgroud)
第一个参数split是编译的正则表达式或正则表达式模式.如果要拆分文本 |.您需要传递匹配的模式|.
quotemeta 从与该字符串匹配的字符串创建模式.
my $delimiter = '|';
my $delimiter_pat = quotemeta($delimiter);
split $delimiter_pat
Run Code Online (Sandbox Code Playgroud)
或者,quotemeta可以作为\Q..\E内部双引号字符串等访问.
my $delimiter = '|';
split /\Q$delimiter\E/
Run Code Online (Sandbox Code Playgroud)
的\E,如果是在年底,甚至可以省略.
my $delimiter = '|';
split /\Q$delimiter/
Run Code Online (Sandbox Code Playgroud)
我提到过它split也接受一个编译的正则表达式.
my $delimiter = '|';
my $delimiter_re = qr/\Q$delimiter/;
split $delimiter_re
Run Code Online (Sandbox Code Playgroud)
如果你不介意对正则表达式进行硬编码,那就和它一样
my $delimiter_re = qr/\|/;
split $delimiter_re
Run Code Online (Sandbox Code Playgroud)
首先,|双引号内部并不特殊.将$ delimiter设置为just "|",然后确保稍后引用它可以工作或者可能设置$ delimiter "\\|"就可以了.
其次,|内部正则表达式是特殊的,所以你想在那里引用它.最安全的方法是让perl为您引用代码.使用\Q...\E正则表达式中的构造来标记要引用的数据.
my @source_header_columns = split(/\Q${delimiter}\E/, $source_header);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2435 次 |
| 最近记录: |