2013-04-09 3 views
1

Я новичок в Perl, и у меня возникла небольшая проблема. Я пытаюсь выбрать одно значение из массива, чтобы сделать его строчным.Array строчный код

E.g.

my @letters = qw(A B C D E F F A S D F E S F); 

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

Заранее спасибо.

+0

вы знали программирования или к синтаксис языка? –

+0

Я новичок в программировании, я много работал с C#/PHP/Python/C++, но Perl, похоже, сильно отличается от синтаксиса. – Toby

+3

'my @new = map {$ _ eq" F "? lc $ _: $ _} @letters; ' – squiguy

ответ

3
for my $c (@letters) {$c = lc($c) if $c eq"F"} 

Я совершенно не знаю, что вы имеете в виду выбрать и сделать его.

+0

В принципе, я пытаюсь посмотреть в массиве @letters , Я выбираю из него значение «F», и я пытаюсь записать это значение в нижнем регистре. – Toby

+0

@Toby: До сих пор неясно, что вы подразумеваете под «выбором ценности». Вы хотите преобразовать * все * вхождения '' F "' в нижний регистр? Первое появление? Каков ваш критерий для «выбора»? –

+0

Я до сих пор не понимаю. Что такое ввод и что выводится? –

-1

Если вы уже знаете расположение в массиве, вы бы сделали: $array[5] = lc($array[5]). Если нет, есть несколько способов. Один из них использует стиль C зацикливание:

for (my $i=0; $i < @array; $i++) { 
    $array[$i] = lc($array[$i]) if $array[$i] eq 'F'; 
} 

другую карту:

map {$_ = lc if $_ eq 'F'} @array; 
0

Short Inplace модификация

my @letters = qw(A B C D E F F A S D F E S F); 
map {s/(F)/\l$1/;} @letters; 
print "@letters"; 

Выход:

A B C D E f f A S D f E S f 
+1

Когда я смотрю 's/F/\ l $ & /;}', он просто радует, что я не использую Perl. : P – Doorknob

+0

@Doorknob Не квалифицирован в регулярных выражениях? – TLP

+1

Эта замена болит, особенно если вы знаете Perl: использование '$ &' и друзей замедляет * все * регулярные выражения в вашей программе. Использование захвата 's/(F)/lc $ 1/e', вероятно, быстрее. – amon

1

Это мой подход :

my @letters = qw(A B C D E F F A S D F E S F); 
@letters = map { tr/F/f/; $_ } @letters; 

UPDATE: так прокомментировал @TLP, это более простой способ:

my @letters = qw(A B C D E F F A S D F E S F); 
tr/F/f/ for @letters; 
+2

Резервированное использование 'map'. Вместо этого используйте 'tr/F/f/for @ letters'. – TLP

0

Если вы не хотите, чтобы сохранить Orginal список

tr/F/f/ for @letters 
Смежные вопросы