【问题标题】:What does "Useless use of a variable in void context" mean in this Perl script?在这个 Perl 脚本中,“在 void 上下文中无用地使用变量”是什么意思?
【发布时间】:2010-07-20 10:13:55
【问题描述】:

下面的脚本给了我我想要的,但 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”之外,我什么也得不到。我错过了什么?有任何想法吗?一如既往地感谢:)

【问题讨论】:

    标签: perl map


    【解决方案1】:

    你想要的是……

    my @processed_url =   map {
                           s{\\u003a}{:}g; 
                           s{\\u002e}{.}g;
                           s{\\u002d}{@}g;
                           $_;
    } @raw_url;
    

    map block 返回由最后一条语句组成的值作为其结果。这就是我们将 $_ 作为最后一条语句传递的原因。替换运算符s{}{} 返回进行的替换次数。

    在您之前的设置中,您自己有以下语句。这是毫无意义的,而这正是 Perl 所警告的。

    s{\\u003a}{:}g, $_;
    

    【讨论】:

    • 对于更漂亮的源代码,您可以使用来自 Algorithm::Loops 的 Filter() 并省略 $_
    【解决方案2】:

    您已经得到了您正在寻找的答案,但我想指出在 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;
    }
    

    【讨论】:

    • 感谢您的输入:) 我最初使用 push 并且它有效,但后来我尝试了 map,但出现了问题,我无法自己解决。我原来的脚本是这样的: for (@raw_url) { s{\\u003a}{:}g; s{\\u002e}{.}g; s{\\u002d}{@}g;推送@processed_url,$_; }
    猜你喜欢
    • 1970-01-01
    • 2012-07-20
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 2012-02-26
    相关资源
    最近更新 更多