perl中的split函数应该如何工作?

时间:2013-11-19 18:11:13

标签: regex perl split

我今天在拆分功能方面遇到了一些困难,请阅读perlfunc 看看我是否错误地解释了一些东西。我试图在'。'上分割一个字符串,因此应该支持perlfunc:

my $string = "hello.world";
my ($hello, $world) = split(".", $string);

my $string = "hello.world";
my ($hello, $world) = split(/\./, $string);

但是,测试第一个导致空变量,所以我将测试扩展到以下内容:

#!/usr/bin/perl

use strict;
use warnings;

my $time_of_test = "13.11.19.11.45.07";
print "TOD: $time_of_test\n";
my ($year, $month, $day, $hr, $min, $sec) = split(/\./, $time_of_test);
print "Test 1 -- Year: $year month: $month day: $day hour: $hr min: $min sec: $sec\n";
($year, $month, $day, $hr, $min, $sec) = split(".", $time_of_test);
print "Test 2 -- Year: $year month: $month day: $day hour: $hr min: $min sec: $sec\n";
($year, $month, $day, $hr, $min, $sec) = split('.', $time_of_test);
print "Test 3 -- Year: $year month: $month day: $day hour: $hr min: $min sec: $sec\n";
($year, $month, $day, $hr, $min, $sec) = split("\.", $time_of_test);
print "Test 4 -- Year: $year month: $month day: $day hour: $hr min: $min sec: $sec\n";
($year, $month, $day, $hr, $min, $sec) = split('\.', $time_of_test);
print "Test 5 -- Year: $year month: $month day: $day hour: $hr min: $min sec: $sec\n";

这是输出:

> ./test.pl  
TOD: 13.11.19.11.45.07
Test 1 -- Year: 13 month: 11 day: 19 hour: 11 min: 45 sec: 07
Test 2 -- Year:  month:  day:  hour:  min:  sec: 
Test 3 -- Year:  month:  day:  hour:  min:  sec: 
Test 4 -- Year:  month:  day:  hour:  min:  sec: 
Test 5 -- Year: 13 month: 11 day: 19 hour: 11 min: 45 sec: 07

这是否按预期工作?如果是这样,我是如何误解perlfunc文档的?

4 个答案:

答案 0 :(得分:9)

split的第一个参数是正则表达式。你不应该在这里使用字符串(除了" "的特殊情况),因为它对实际行为有误导性。

"."'.'分割时没有结果的原因是它将这些解释为正则表达式(拆分所有内容)。

使用/\./'\.',您获得了预期的结果,因为正确表达式中的点被正确转义。

您没有得到"\."的任何结果,因为在被split视为正则表达式之前,它首先被双引号字符串视为转义序列。当它进入split调用时,它与"."相同。

答案 1 :(得分:4)

字符串文字'\n'生成字符串\n。字符串文字'.'生成字符串.。该字符串应该是一个正则表达式。正则表达式中的.匹配除换行符之外的任何字符。正则表达式\.将匹配句点,并且可以从字符串文字'\.''\\.'创建该字符串。如果你使用/\./,那么逃避大多数模式的误导性和简单性都会降低。

答案 2 :(得分:0)

split函数中的第一个参数是正则表达式。 在正则表达式'。'中意思是'任何角色'。如果你想在点处拆分,可以通过转义'。'

来使用/\ ./

答案 3 :(得分:0)

如果您想使用字符串拆分.,则必须将其转义两次:

my $string = 'hello.world';
my ($hello, $world) = split('\\.', $string);
print "$hello\n";

输出“你好”。

如果您只传入'\.',则最终只会在分割函数中显示为通配符'.'。您需要两个反斜杠,以便最终将'\.'传递给split函数。