Как я выполняю замену Perl относительно строки при хранении оригинала?

public static int getMostCommonElement(int[] array) {

    Arrays.sort(array);

    int frequency = 1;
    int biggestFrequency = 1;
    int mostCommonElement = 0;

    for(int i=0; i<array.length-1; i++) {
        frequency = (array[i]==array[i+1]) ? frequency+1 : 1;
        if(frequency>biggestFrequency) {
            biggestFrequency = frequency; 
            mostCommonElement = array[i];
        }
    }

    return mostCommonElement;
}
169
задан the Tin Man 1 August 2013 в 18:12
поделиться

5 ответов

Это - идиома, я всегда раньше получал измененную копию строки, не изменяя оригинал:

(my $newstring = $oldstring) =~ s/foo/bar/g;

В жемчуге 5.14.0 или позже, можно использовать новое /r неразрушающий модификатор замены:

my $newstring = $oldstring =~ s/foo/bar/gr; 
<час>

Примечание: вышеупомянутые решения работают без g также. Они также работают с любыми другими модификаторами.

242
ответ дан ikegami 23 November 2019 в 20:51
поделиться

Оператор:

(my $newstring = $oldstring) =~ s/foo/bar/g;

, Который эквивалентен:

my $newstring = $oldstring;
$newstring =~ s/foo/bar/g;

, С другой стороны, с Perl 5.13.2 можно использовать /r, чтобы сделать не разрушительную замену:

use 5.013;
#...
my $newstring = $oldstring =~ s/foo/bar/gr;
42
ответ дан Loovjo 23 November 2019 в 20:51
поделиться

Под use strict, скажите:

(my $new = $original) =~ s/foo/bar/;

вместо этого.

21
ответ дан the Tin Man 23 November 2019 в 20:51
поделиться

Решение остроты более полезно как шибболет, чем хороший код; хорошие кодеры Perl будут знать это и понимать его, но это намного менее прозрачно и читаемо, чем двустишие копировать-и-изменять с двумя строками, с которого Вы запускаете.

, Другими словами, хороший способ сделать это - способ, которым Вы уже выполнение его. Ненужная краткость за счет удобочитаемости не является победой.

9
ответ дан brian d foy 23 November 2019 в 20:51
поделиться

Если Вы запишете Perl с use strict;, то Вы найдете, что один синтаксис строки не допустим, даже когда объявлено.

С:

my ($newstring = $oldstring) =~ s/foo/bar/;

Вы добираетесь:

Can't declare scalar assignment in "my" at script.pl line 7, near ") =~"
Execution of script.pl aborted due to compilation errors.

Вместо этого синтаксис, который Вы использовали, в то время как строка дольше, синтаксически корректный способ сделать это с use strict;. Для меня, с помощью use strict; просто привычка теперь. Я делаю это автоматически. Все должны.

#!/usr/bin/env perl -wT

use strict;

my $oldstring = "foo one foo two foo three";
my $newstring = $oldstring;
$newstring =~ s/foo/bar/g;

print "$oldstring","\n";
print "$newstring","\n";
-1
ответ дан the Tin Man 23 November 2019 в 20:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: