2013-06-28 4 views
-2

В Perl, что делает следующее выражение сделать:Что Perl регулярное выражение, разделенных запятыми означают

$datarow =~ s/,null/,/g; 
+6

['perldoc perlre'] (http://perldoc.perl.org/perlre.html) и [' perldoc perlop'] (http://perldoc.perl.org/perlop.html) – pilcrow

+7

Запятая незначительный; это просто запятая. –

+2

Не будьте слишком тяжелы на OP. Это не стандартный способ, как обычно пишется функция, и сбивает с толку, когда вы не используете ее. В PHP это было бы как-то вроде '$ datarow = ereg_replace (", null ",", ", $ datarow);" То есть есть ясная функция ('ereg_replace'), ясный набор аргументов (' " , null "', '", "' и '$ datarow), и переменная, которая получает значение (снова' $ datarow').Конструкция sed/awk от Perl может быть очень трудно понять, если вы не человек Unix. –

ответ

6

s/pattern/replacement/ является команда, которая говорит Perl, чтобы заменить первое вхождение pattern с replacement.

s/pattern/replacement/g заставляет команду заменить все вхождения, а не только первую.

Что делает ваш код, он находит все вхождения ,null и заменяет их , (удаляет null после каждой запятой).

0

В Perl, то s/ после =~ означает, что вы делаете замену (в отличии от m/ после =~ который является оценкой матча), то ,null является строкой, которую вы хотите заменить ,, который приходит после того, как средний / и /g означает, что это глобальная замена, в противном случае это будет просто заменить первый ...

вхождение
1

Это простая команда замены:

$string =~ s/find/replace/; 

В выше, тыс e изменяется $string. Первый экземпляр строки find будет заменен на replace.

Добавление g на конце означает глобальной, и что она заменит все экземпляры find с replace.

В вашей команде изменяется переменная $datarow. Все экземпляры ,null заменяются только запятой. Попробуйте использовать следующий скрипт:

#! /usr/bin/env perl 

use strict; 
use warnings; 
use feature qw(say); 

my $datarow = "this,that,null,this,that,null,this,this,that"; 
$datarow =~ s/,null/,/g; 
say "Datarow is equal to `$datarow'"; 

Идите дальше и попробуйте эту программу. Он должен вывести:

Datarow is equal to `this,that,,this,that,,this,this,that' 

я упростил здесь. find - это не просто строка букв и цифр, а regular expression. Регулярное выражение - это мощная концепция, но загадочная концепция, которую большинство разработчиков не понимают в полной мере. Однако здесь не используются никакие магические заклинания регулярных выражений, так что это просто описание строки литерала ,null.

Тем не менее, вы должны потратить время на изучение учебника Regular Expression, который включен в Perl.