Как удалить список последовательностей символов в начале строки в Perl? - PullRequest
1 голос
/ 29 марта 2011

Мне нужно прочитать строки из файла и сохранить их в хеше в Perl. Многие из этих строк имеют специальные последовательности символов в начале, которые мне нужно удалить перед сохранением. Эти последовательности символов

| || ### ## @@||

Например, если это ||https://ads, мне нужно получить https://ads; если ###http, мне нужно получить http.

Мне нужно исключить эти последовательности символов. Я хочу сделать это, имея все последовательности символов, которые нужно исключить из массива, а затем проверь, начинается ли строка с этих последовательностей символов, и удали их. Какой хороший способ сделать это?

Я дошел до:

our $ad_file = "C:/test/list.txt";
our %ads_list_hash = ();

my $lines = 0;

# List of lines to ignore
my @strip_characters = qw /| || ### ## @@||/;

# Create a list of substrings in the easylist.txt file
open my $ADS, '<', $ad_file or die "can't open $ad_file";

while(<$ADS>) {
    chomp;
    $ads_list_hash{$lines} = $_;
    $lines ++;
}

close $ADS;

Мне нужно добавить логику для удаления @strip_characters из начала каждой строки, если какая-либо из них присутствует.

Ответы [ 5 ]

4 голосов
/ 29 марта 2011

Возможно, слишком сложный и общий для этой задачи, но все же ..

my $strip = join "|", map {quotemeta} @strip_characters;
# avoid bare [] etc. in the RE

# ... later, in the while()
    s/^(?:$strip)+//o; 
    # /o means "compile $strip into the regex once and for all"
3 голосов
/ 29 марта 2011

Почему бы вам не сделать это с помощью регулярного выражения?Что-то вроде

$line =~ s/^[#@ |]+//;

должно работать.

1 голос
/ 29 марта 2011
$ads_list_hash{$lines} = $_;
$lines ++;

Не делай этого. Если вы хотите массив, используйте массив:

push @ads_lines, $_;

Правило программирования Шона № 7: При создании структур данных: если важно сохранить порядок, используйте массив; в противном случае используйте хеш.

1 голос
/ 29 марта 2011

Если вы хотите удалить список из символов (в соответствии с вашим названием), то будет работать очень простое регулярное выражение.
В цикле добавьте следующее регулярное выражение

while( <$ADS> ) {
    chomp;
    s/^[#@ \|]+//;
    $ads_list_hash{$lines++} = $_;
}

Обратите внимание, что символ трубы ('|') экранирован.Однако, похоже, что вы хотите удалить список выражений .Вы можете сделать следующее

while( <$ADS> ) {
    chomp;
    s/^((\|)|(\|\|)|(###)|(##)|(@@\|\|))+//;
   $add_list_hash{$lines++} = $_;
}

Вы сказали, что список выражений хранится в массиве или словах.В вашем примере кода вы создаете этот массив с помощью 'qw'.Если список выражений неизвестен во время компиляции, вы можете построить регулярное выражение в переменной и использовать его.

my @strip_expression = ... // get an array of strip expressions
my $re = '^((' . join(')|(',@strip_expression) . '))+';

, а затем использовать следующий оператор в цикле: s / $re //;

Наконец, можно сказать одну вещь, не связанную с вопросом о коде: было бы гораздо более уместным использовать Array вместо Hash, чтобы отобразить целое число в набор строк.Если у вас нет других требований, лучше иметь:

our @ads_list;    // no need to initialize the array (or the hash) with empty list
...
while( <$ADS> ) {
    chomp;
    s/.../;
    push @ads_list, $_;
}
0 голосов
/ 29 марта 2011

Поскольку подстановки возвращают, сделали ли они что-нибудь или нет, вы можете использовать подстановку для поиска строки по вашему шаблону и удалить ее, если она есть.

while( <$ADS> ) {
    next unless s/^\s*(?:[#]{2,3}|(?:@@)?[|]{1,2})\s*//;
    chomp;
    $ads_list_hash{$lines} = $_;
    $lines ++;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...