Что означает «Бесполезное использование переменной в пустом контексте» в этом скрипте Perl? - PullRequest
3 голосов
/ 20 июля 2010

Следующий скрипт дает мне то, что я хочу, но Perl также выдает мне предупреждение «Бесполезное использование переменной в пустом контексте».Что это значит?

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".Что мне не хватает?Есть идеи?Спасибо как всегда :) 1007 *

Ответы [ 2 ]

9 голосов
/ 20 июля 2010

То, что вы хотите, это ...

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

A блок карты возвращает значение, состоящее из последнего оператора, оцененного как его результат. Вот почему мы передаем $ _ как последнее утверждение. Оператор подстановки s {} {} возвращает количество выполненных подстановок.

В вашей предыдущей настройке вы сами сделали следующее утверждение. Что в значительной степени бессмысленно, и именно об этом Perl предупреждает.

s{\\u003a}{:}g, $_;
5 голосов
/ 20 июля 2010

У вас уже есть ответ, который вы искали, но я хотел бы подчеркнуть тонкость использования оператора подстановки внутри блока 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...