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'
];
答案 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发表评论。