以下脚本为我提供了我想要的内容,但Perl也向我发出警告,说“无效使用void上下文中的变量”。这是什么意思?
use strict;
use warnings;
my $example = 'http\u003a//main\u002egslb\u002eku6\u002ecom/c0/q7LmJPfV4DfXeTYf/1260269522170/93456c39545857a15244971e35fba83a/1279582254980/v632/6/28/a14UAJ0CeSyi3UTEvBUyMuBxg\u002ef4v\u002chttp\u003a//main\u002egslb\u002eku6\u002ecom/c1/q7LmJPfV4DfXeTYf/1260269522170/3cb143612a0050335c0d44077a869fc0/1279582254980/v642/10/20/7xo2MJ4tTtiiTOUjEpCJaByg\u002ef4v\u002chttp\u003a//main\u002egslb\u002eku6\u002ecom/c2/q7LmJPfV4DfXeTYf/1260269522170/799955b45c8c32c955564ff9bc3259ea/1279582254980/v652/32/4/6pzkCf4iqTSUVElUA5A3PpMAoA\u002ef4v\u002chttp\u003a//main\u002egslb\u002eku6\u002ecom/c3/q7LmJPfV4DfXeTYf/1260269522170/cebbb619dc61b3eabcdb839d4c2a4402/1279582254980/v567/36/19/MBcbnWwkSJu46UoYCabpvArA\u002ef4v\u002chttp\u003a//main\u002egslb\u002eku6\u002ecom/c4/q7LmJPfV4DfXeTYf/1260269522170/1365c39355424974dbbe4ae8950f0e73/1279582254980/v575/17/15/EDczAa0GTjuhppapCLFjtaQ\u002ef4v';
my @raw_url = $example =~ m{(http\\u003a.+?f4v)}g;
my @processed_url = map {
s{\\u003a}{:}g,$_;
s{\\u002e}{.}g,$_;
s{\\u002d}{@}g,$_;
} @raw_url;
print join("\n",@processed_url);
如果我省略这样的美元下划线,为什么这个地图不起作用?
my @processed_url = map {
s{\\u003a}{:}g;
s{\\u002e}{.}g;
s{\\u002d}{@}g;
} @raw_url;
当我省略那些美元下划线时,除了可能的成功标志“1”之外我什么也得不到。我错过了什么?有任何想法吗?总是如此谢谢:)
答案 0 :(得分:9)
你想要的是......
my @processed_url = map {
s{\\u003a}{:}g;
s{\\u002e}{.}g;
s{\\u002d}{@}g;
$_;
} @raw_url;
A map block返回由最后一个语句组成的值作为结果。这就是为什么我们传递$ _作为最后一个声明。替换运算符s{}{}返回替换次数。
在您之前的设置中,您自己拥有以下声明。这几乎毫无意义,这正是Perl警告的内容。
s{\\u003a}{:}g, $_;
答案 1 :(得分:5)
你已经找到了你想要的答案,但我想指出在map块中使用替换运算符的一个微妙之处:你的原始数组也在被修改。如果你想保留原始数组,一种方法是制作数组的副本,然后只修改副本:
my @processed_url = @raw_url;
for (@processed_url) {
s{\\u003a}{:}g;
s{\\u002e}{.}g;
s{\\u002d}{@}g;
}
或者,如果您只需要一个数组,并且希望修改原始数据:
for (@raw_url) {
s{\\u003a}{:}g;
s{\\u002e}{.}g;
s{\\u002d}{@}g;
}