有人可以解释这种奇怪的行为:
我在一个字符串中有hava路径,我想为每个反斜杠拆分它
my $path = "D:\Folder\AnotherFolder\file.txt";
my @folders = split('\', $path);
Run Code Online (Sandbox Code Playgroud)
在上面的情况下,即使逃避反斜杠,它也不会工作:
my @folders = split('\\', $path);
Run Code Online (Sandbox Code Playgroud)
但在正则表达式的情况下,它将工作:
my @folders = split( /\\/, $path);
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
我想amon在他的评论中给出了你问题的最佳字面答案:
更明确:字符串和正则表达式具有不同的转义规则.如果使用字符串代替正则表达式,则字符串文字会遭受双重转义
split '\\'使用字符串并split /\\/使用正则表达式的含义.
作为一个实际的答案,我想补充一点:
也许您应该考虑使用适合拆分路径的模块.File::Spec是Perl 5中的核心模块.而且,你必须在双引号字符串中转义反斜杠,这是你没有做过的.你也可以使用单引号,在我看来看起来好一些.
use strict;
use warnings;
use Data::Dumper;
use File::Spec;
my $path = 'D:\Folder\AnotherFolder\file.txt'; # note the single quotes
my @elements = File::Spec->splitdir($path);
print Dumper \@elements;
Run Code Online (Sandbox Code Playgroud)
输出:
$VAR1 = [
'D:',
'Folder',
'AnotherFolder',
'file.txt'
];
Run Code Online (Sandbox Code Playgroud)
如果您通过运行查看文档:
perldoc -f split
Run Code Online (Sandbox Code Playgroud)
您将看到三种形式的参数split:
split /PATTERN/,EXPR,LIMIT
split /PATTERN/,EXPR
split /PATTERN/
Run Code Online (Sandbox Code Playgroud)
这意味着即使您传递split字符串作为第一个参数,perl也会将其强制转换为正则表达式。
如果我们查看在尝试执行以下操作时收到的警告re.pl:
$ my $string_with_backslashes = "Hello\\there\\friend";
Hello\there\friend
$ my @arry = split('\\', $string_with_backslashes);
Compile error: Trailing \ in regex m/\/ at (eval 287) line 6.
Run Code Online (Sandbox Code Playgroud)
我们看到,首先,'\\'被插入为反斜杠转义符,后跟实际的反斜杠,其计算结果为单个反斜杠。
split然后输入我们给它的反斜杠,并将其强制为正则表达式,就像我们写的一样:
$ my @arry = split(/\/, $string_with_backslashes);
Run Code Online (Sandbox Code Playgroud)
这是行不通的,因为只有一个反斜杠,它被解释为简单地转义其后的正斜杠(没有终止符/)以表明正则表达式已结束。