我今天在拆分功能方面遇到了一些困难,请阅读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文档的?
答案 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函数。