如何在perl中用\分割字符串?

时间:2017-08-26 03:40:31

标签: regex perl split

 Post.find({}, {mid: 1,_id:1}).exec(function (err, doc) {
             doc.map((item, key) => {
                Post.findByIdAndUpdate({_id:item._id},{$set:{mid: mongoose.Types.ObjectId(item.mid)}}).exec((err,res)=>{
                    if(err) throw err;
                    reply(res);
                });
            });
        });

输出:

use Data::Dumper qw(Dumper);

@arr=split('\/',"\Program Files\Microsoft VisualStudio\VC98\Bin\Rebase.exe");

print(Dumper \@arr);

必填项:

$VAR1 = [     

'Program FilesMicrosoft VisualStudioVC98BinRebase.exe'

];

1 个答案:

答案 0 :(得分:7)

您正在分割转发斜线/(由\转义),而您显然需要\

由于\本身逃脱了事情,你也需要逃避它

use warnings;
use strict;
use feature 'say';

my $str = '\Program Files\Microsoft VisualStudio\VC98\Bin\Rebase.exe';

my @ary = split /\\/, $str;

shift @ary if $ary[0] eq '';

say for @ary;

打印路径组件的内容,每行一个。

由于此字符串以\开头,@ary的第一个元素将成为空字符串,因为它位于第一个\之前。我们通过shift将其从数组中删除,并进行检查。

请注意,对于此字符串,一个必须使用'',或运算符形式为q(...),因为双引号会尝试插入假定的转义符\P,字符串中的\M(等),失败并显示警告。当您需要插入变量时,最好使用''用于文字字符串和""(或qq())。

另一种方法是使用正则表达式

my @ary = $str =~ /[^\\]+/g;

否定字符类[^...],(转义)\匹配任何不是\的字符。量词+意味着在匹配尽可能多的次数时需要至少一个这样的匹配。因此,这匹配到第一个\之前的字符序列。

使用修饰符/g,匹配将继续通过字符串以查找所有此类模式。

分配给数组会将匹配运算符放在列表上下文中,其中将返回匹配列表,并将其分配给@ary。在标量上下文中,仅返回true(1)或false(空字符串)。

这里不需要捕获(),因为我们想要匹配的所有内容。 通常,需要列表上下文中的(),以便仅返回捕获的匹配项。

有了这个,我们不必担心开头的空字符串,因为在第一个\之前没有匹配,因为在我们请求至少一个非{{}之前没有字符。 1}}。

但是使用路径很常见,并且有适合的工具,可以处理细节。核心模块File::Spec是多平台的,其splitdir打破了组件的路径

\

如果路径以use File::Spec; my @path_components = File::Spec->splitdir($str); (或Unix / Mac上的\)开头,则第一个元素也是空字符串。

感谢Sinan Ünür发表评论。