2013-12-21 3 views
1

У меня есть список имен пользователей и имен баз данных (см. Ниже). 39-я строка - «Образец AHernandez».Неожиданное поведение оператора модуля в Perl

Вот мой код сценария:

use strict; 
use warnings; 

my $i = 0; 
my $n = 13; 

while (<>) { 
    s/Sample /Sample Basic/ unless ++$i % $n; 
    print; 
} 

Вот как я звоню сценарий: Perl test1.txt> Test3.txt.

Вот и нечетная часть. 39-я строка, или 4-й экземпляр, изменяется кодом. Sample становится Sample Basic. Затем ожидается ожидаемое поведение каждого 13-го экземпляра. Почему 4-й экземпляр «Образца» меняется, а затем каждый 13-й после этого?

админ
AEluf Bane
AEluf PoiznIvy
AEluf MrFreeze
AEluf демо
AEluf Образец
AEluf Sample_U
AEluf Samppart
AEluf Sampeast
AEluf ASOsamp
AEluf PFPSamp
AEluf SampApp
AGodfrey Bane
AGodfrey PoiznIvy
AGodfrey MrFreeze
AGodfrey демо
AGodfrey Образец
AGodfrey Sample_U
AGodfrey Samppart
AGodfrey Sampeast
AGodfrey ASOsamp
AGodfrey PFPSamp
AGodfrey SampApp
Agold Bane
Agold PoiznIvy
Agold MrFreeze
Agold демо
Agold Образец
Agold Sample_U
Agold Samppart
Agold Sampeast
Agold ASOsamp
Agold PFPSamp
Agold SampApp
AHernandez Bane
AHernandez PoiznIvy
AHernandez MrFreeze
AHernandez Демо-версия
AHernandez Sample Basic
AHernandez Sample_U
AHernandez Samppart
AHernandez Sampeast
AHernandez ASOsamp
AHernandez PFPSamp
AHernandez SampApp

ответ

2

Ваш скрипт пытается заменить s/// является каждый 13-й строке файла (13 , 26,39,52 и т.д.)

https://eval.in/81619

[line: 1; (1 % 13)=> 1; try_replace: no] admin 
[line: 2; (2 % 13)=> 2; try_replace: no] AEluf Bane 
[line: 3; (3 % 13)=> 3; try_replace: no] AEluf PoiznIvy 
[line: 4; (4 % 13)=> 4; try_replace: no] AEluf MrFreeze 
[line: 5; (5 % 13)=> 5; try_replace: no] AEluf Demo 
[line: 6; (6 % 13)=> 6; try_replace: no] AEluf Sample 
[line: 7; (7 % 13)=> 7; try_replace: no] AEluf Sample_U 
[line: 8; (8 % 13)=> 8; try_replace: no] AEluf Samppart 
[line: 9; (9 % 13)=> 9; try_replace: no] AEluf Sampeast 
[line:10; (10 % 13)=>10; try_replace: no] AEluf ASOsamp 
[line:11; (11 % 13)=>11; try_replace: no] AEluf PFPSamp 
[line:12; (12 % 13)=>12; try_replace: no] AEluf SampApp 
[line:13; (13 % 13)=> 0; try_replace:yes] AGodfrey Bane 
[line:14; (14 % 13)=> 1; try_replace: no] AGodfrey PoiznIvy 
[line:15; (15 % 13)=> 2; try_replace: no] AGodfrey MrFreeze 
[line:16; (16 % 13)=> 3; try_replace: no] AGodfrey Demo 
[line:17; (17 % 13)=> 4; try_replace: no] AGodfrey Sample 
[line:18; (18 % 13)=> 5; try_replace: no] AGodfrey Sample_U 
[line:19; (19 % 13)=> 6; try_replace: no] AGodfrey Samppart 
[line:20; (20 % 13)=> 7; try_replace: no] AGodfrey Sampeast 
[line:21; (21 % 13)=> 8; try_replace: no] AGodfrey ASOsamp 
[line:22; (22 % 13)=> 9; try_replace: no] AGodfrey PFPSamp 
[line:23; (23 % 13)=>10; try_replace: no] AGodfrey SampApp 
[line:24; (24 % 13)=>11; try_replace: no] AGold Bane 
[line:25; (25 % 13)=>12; try_replace: no] AGold PoiznIvy 
[line:26; (26 % 13)=> 0; try_replace:yes] AGold MrFreeze 
[line:27; (27 % 13)=> 1; try_replace: no] AGold Demo 
[line:28; (28 % 13)=> 2; try_replace: no] AGold Sample 
[line:29; (29 % 13)=> 3; try_replace: no] AGold Sample_U 
[line:30; (30 % 13)=> 4; try_replace: no] AGold Samppart 
[line:31; (31 % 13)=> 5; try_replace: no] AGold Sampeast 
[line:32; (32 % 13)=> 6; try_replace: no] AGold ASOsamp 
[line:33; (33 % 13)=> 7; try_replace: no] AGold PFPSamp 
[line:34; (34 % 13)=> 8; try_replace: no] AGold SampApp 
[line:35; (35 % 13)=> 9; try_replace: no] AHernandez Bane 
[line:36; (36 % 13)=>10; try_replace: no] AHernandez PoiznIvy 
[line:37; (37 % 13)=>11; try_replace: no] AHernandez MrFreeze 
[line:38; (38 % 13)=>12; try_replace: no] AHernandez Demo 
[line:39; (39 % 13)=> 0; try_replace:yes] AHernandez Sample BasicBasic 
[line:40; (40 % 13)=> 1; try_replace: no] AHernandez Sample_U 
[line:41; (41 % 13)=> 2; try_replace: no] AHernandez Samppart 
[line:42; (42 % 13)=> 3; try_replace: no] AHernandez Sampeast 
[line:43; (43 % 13)=> 4; try_replace: no] AHernandez ASOsamp 
[line:44; (44 % 13)=> 5; try_replace: no] AHernandez PFPSamp 
[line:45; (45 % 13)=> 6; try_replace: no] AHernandez SampApp 

Чтобы заменить каждый N-й вхождение строки:

while (<>) { 
    ++$i if /Sample /; 
    s/Sample /Sample Basic/ unless $i % $n; 
    print; 
} 
+0

О, я вижу. Итак, как мне получить каждый 13-й экземпляр строки «Образец» вместо каждых 13 строк? Спасибо! –

+0

@DrewRush проверить обновление –