Сохранение результата регулярного выражения в новой переменной - PullRequest
12 голосов
/ 21 ноября 2011

Следующая программа предназначена для перестановки строки. В строке 8 я пытаюсь сохранить результаты регулярного выражения в новой переменной $ newdate, но когда $ newdate печатается в строке 9, отображается только 1. Как я могу изменить свой код, чтобы $ newdate сохранял $ date значение из операции регулярного выражения?

1 #!/usr/bin/perl
2 
3 # This program changes the date format from mm/dd/yyyy to yyyy,mm,dd
4 
5 $date = '21/11/2011';
6 print "Current: $date\n";
7
8 $newdate = $date =~ s/(..)\/(..)\/(....)/$3,$2,$1/;
9 print "New: $newdate\n";

Ответы [ 4 ]

16 голосов
/ 21 ноября 2011

Вы также можете сделать это так:

my $date = '21/11/2011';
print "Current: $date\n";
my $newdate;
($newdate = $date) =~ s/(..)\/(..)\/(....)/$3,$2,$1/;
print $newdate;
12 голосов
/ 21 ноября 2011

Начиная с Perl 5.13.2, неразрушающая замена может быть указана с помощью модификатора s///r, поэтому вместо числа совпадений назначается копия строки после замены.Это также предотвращает изменение исходной строки, что означает, что два назначения имеют одинаковое поведение:

( my $new_date = $date ) =~ s<(..)/(..)/(....)><$3,$2,$1>; # Pre-5.13.2

  my $new_date = $date =~ s<(..)/(..)/(....)><$3,$2,$1>r;  # Post-5.13.2

С perldoc perl5132delta:

Неразрушающее замещение

Оператор замещения теперь поддерживает опцию /r, которая копирует входную переменную, выполняет подстановку в копии и возвращает результат.Оригинал остается неизменным.

my $old = 'cat';
my $new = $old =~ s/cat/dog/r;
# $old is 'cat' and $new is 'dog'
4 голосов
/ 21 ноября 2011

Оператор =~ вернет количество изменений, внесенных при замене, и, если вы не сделаете это глобально, он всегда вернет 1 или 0. Кроме того, замены выполняются на месте, поэтому, если ваша цель не изменять $date, вы не хотите заменять.

Попытка:

$date =~ m/(..)\/(..)\/(....)/;
$newdate = "$3,$2,$1";
1 голос
/ 21 ноября 2011

В духе TIMTOWTDI:

my $date = '21/11/2011';

my $newdate = join ",", reverse split m#/#, $date;

Это просто работает, потому что вы хотите обратный порядок чисел.Вы также можете сделать это:

my $newdate = join ",", ( split m#/#, $date )[2,1,0];

Еще одним способом:

my $newdate = join ",", reverse ( $date =~ /(\d+)/g );

Также: Зачем использовать строгие и предупреждения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...