Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl使用基于字符串的分隔符拆分字符串_Regex_Perl_Variables_Split_Delimiter - Fatal编程技术网

Regex Perl使用基于字符串的分隔符拆分字符串

Regex Perl使用基于字符串的分隔符拆分字符串,regex,perl,variables,split,delimiter,Regex,Perl,Variables,Split,Delimiter,我是Perl的新手,但根据我所阅读的文档,Perl中的split函数似乎要求使用正则表达式模式而不是字符串分隔符作为第一个参数,但我发现使用类似于print+(split(“”,$string))[0]的方法仍然可以正确分割字符串 基于此,我尝试使用一个变量分隔符(例如,print+(split($var,$string))[0],其中$var='')发现它不起作用。我做错了什么 谢谢 编辑: 很抱歉问了这么糟糕的问题。我对一个带前导空格的字符串运行这个函数,发现split函数不喜欢前导空格。例

我是Perl的新手,但根据我所阅读的文档,Perl中的split函数似乎要求使用正则表达式模式而不是字符串分隔符作为第一个参数,但我发现使用类似于
print+(split(“”,$string))[0]
的方法仍然可以正确分割字符串

基于此,我尝试使用一个变量分隔符(例如,
print+(split($var,$string))[0]
,其中
$var=''
)发现它不起作用。我做错了什么

谢谢

编辑: 很抱歉问了这么糟糕的问题。我对一个带前导空格的字符串运行这个函数,发现split函数不喜欢前导空格。例如:

my$var='';
打印+(拆分($var,'abc-ddd'))[0]
给出一个空白输出。$var是否在split函数中被解释为
/$var/

print+(拆分(''abc-ddd'))[0]
它给出了一个
abc

因此,当我阅读文档时,我假设我的变量将被视为一个文本字符串,而实际上它不是,因此前导空格没有被删除。

解释 当您在文本空间上拆分时

split ' '
您可以调用特殊情况,如中所述。当您使用变量时

my $var = ' ';
split $var;
这与将该变量放入正则表达式中相同:

split /$var/;
这将在单个空格上拆分,而不是相同的内容。例如,如果您有以下代码:

my $string = "foo bar   baz";
my @literal = split ' ', $string;
my @space = split / /, $string;
然后
@literal
将包含
“foo”、“bar”、“baz”
@space
将包含
“foo”、“bar”、““””、“baz”
——在单个空格上拆分的空字段


文档 以下是文档对其的描述:

作为另一种特殊情况,split模拟命令行工具awk在模式被省略或由单个空格字符组成的文本字符串(例如“”或“\x20”,但不是例如//)时的默认行为。在这种情况下,EXPR中的任何前导空格都会在分割发生之前被删除,而模式会被视为是/\s+/;特别是,这意味着任何连续的空格(不仅仅是单个空格字符)都用作分隔符。但是,通过指定模式//而不是字符串“”,可以避免这种特殊处理,从而只允许单个空格字符作为分隔符。在早期的Perls中,这种特殊情况被限制为使用普通“”作为要拆分的模式参数,在Perl 5.18.0中,这种特殊情况由任何计算为简单字符串“”的表达式触发

变通办法
请注意,如果您正在寻找通过使用变量动态模拟
'
拆分的方法,则可以使用
/\s+/
。这不完全一样,因为它不会去掉前导空格,但在其他方面应该可以像预期的那样工作。

我认为您的代码工作得很好

my $text = "botolo";
my $separator = "o";
print +(split($separator, $text))[0];  
#uglyness with + necessary because Perl
虽然,我宁愿多写一行,但最后一行是:

my @parts = split($separator, $text);
print $parts[0];

工作很好。。。每当您对Perl的一个内置函数有疑问时,我强烈建议您检查
perldoc
。如果它安装在您的系统上,您可以运行
perldoc-f
,或者在本例中,(为了方便起见,我链接到了在线版本)。文档非常好。详细解释了您对使用regex与string进行
split
的不确定性,包括
split''
的特殊情况。什么是“不工作”?“不起作用”对于我们理解这个问题来说是不够的。你试的时候发生了什么?你收到错误消息了吗?你得到了不正确的结果吗?你没有得到结果吗?如果结果不正确,是什么导致结果不正确?你在期待什么?你得到正确的结果了吗?如果是,它们是什么?不要让我们猜测。因为
split''
将使用文字空格作为分隔符,调用perldoc中描述的特殊情况<代码>$var='';split$var将等同于
split/
,这是一种正则表达式拆分,不是一回事。谢谢!以及准确理解我的问题的方法:)