Perl在任何定界器上拆分

Perl在任何定界器上拆分,perl,split,Perl,Split,如何拆分以变量作为分隔符的行。变量可以是任何东西,例如 :,\s |。或者任何一个字 我试过这个: GetOptions ( 'f1=s' => \$file1, "fs1=s" => \$fs1 ); open(fh1, $file1); while(my $row1 = <fh1>) { chomp $row1; @temp=split(/\Q$fs1/, $row1); } 但这是行不通的。我使用$fs1文件分隔符作为用户的输入

如何拆分以变量作为分隔符的行。变量可以是任何东西,例如 :,\s |。或者任何一个字

我试过这个:

GetOptions (
    'f1=s' => \$file1,
    "fs1=s" => \$fs1
);

open(fh1, $file1);

while(my $row1 = <fh1>) {
    chomp $row1;
    @temp=split(/\Q$fs1/, $row1);
}
但这是行不通的。我使用$fs1文件分隔符作为用户的输入。

\Q是引用的开始,您应该\E结束引用:

@temp = split(/\Q$fs1\E/, $row1);
要了解那里发生了什么,你可以试试quotemeta。它的作用与\Q完全相同\E:

如果$fs1类似于字母、数字或正则表达式特殊字符,可能是a+或*,这将起作用

如果要传递正则表达式特殊值,请删除\Q:


例如,$fs1可能包含在任何空格处拆分的\s,如char或在任何字母数处拆分的+。

只要不指定任何正则表达式元字符,代码就可以正常工作

use strict;
use warnings 'all';

my $fs1 = ':=';

my $row1 = 'a:=b:=c:=d:=e';

my @fields = split /\Q$fs1/, $row1;

use Data::Dump;
dd \@fields;
输出
我能想到的唯一问题是,如果您指定类似于\s的内容,那么\Q将转义它,这样您将在两个字符上拆分,反斜杠后跟s,而不是空白字符。也许您只需要删除\Q?但是,您必须在输入行中转义方括号、大括号、管道等字符。

您不需要\E来结束转义。如果未指定分隔符是\s或|,则需要在shell中转义命令行参数。你是如何运行你的程序的?打印$fs1以确保它正确地到达perl可执行文件。解释什么是不工作总是明智的。这本身毫无帮助
@temp = split(/$fs1/, $row1);
use strict;
use warnings 'all';

my $fs1 = ':=';

my $row1 = 'a:=b:=c:=d:=e';

my @fields = split /\Q$fs1/, $row1;

use Data::Dump;
dd \@fields;
["a" .. "e"]