LINUX.ORG.RU

вообще-то и без перла можно обойтись, но раз уж с ним - то че-нить типа 
этого:
#!/usr/bin/perl
open(INSTR, "$ARGV[0]") or die "oops!\n" ;
open(OUTSTR, ">$ARGV[1]") or die "oops!\n" ;
while(<INSTR>) {
$_ =~ s/k1/a/g ;
$_ =~ s/k2/a/g ;
$_ =~ s/k3/a/g ;
print OUTSTR $_;
}
close(INSTR);
close(OUTSTR);
очень тупо в лоб, но работать будет :)

sasha999 ★★★★
()
Ответ на: комментарий от sasha999

Блин фишка в и т.д. Если так влоб я это и на перле и на шелле знаю...
Писать весь список не охота а поумнеть чуть чуть охота:)))

anonymous
()
Ответ на: комментарий от anonymous

боюсь что без списка - будь то хэш или массив - никак не обойтись :(

sasha999 ★★★★
()
Ответ на: комментарий от sasha999

разумеется.

Товарищ не объяснил, чего он хочет. Он хочет менять список, но не хочет указывать весь список, который менять? Так нельзя.

Можно сделать
1) если список регулярен (т.е. надо провести какое-то описываемое правилом преобразование, типа все числа увеличить на единицу) - то можно воспользоваться s///e;
2) если нет (а у меня нет никаких оснований предполагать, что пункт 1 выполняется) - то надо просто указывать список. Но не делать лишних движений - почитайте Ларри, он очень хорошо объясняет, как и для чего надо использовать перл. Буквально Вашу программу он приводит как пример ОЧЕНЬ ПЛОХОГО программирования на Perl.
А я лишь показал человеку, что все можно написать в один one-liner, и работать он будет ЛУЧШЕ. читайте man по флагам perl.

Zulu ★★☆☆
()
Ответ на: комментарий от Zulu

Зависимость есть ну давайте заменим задачу...
Нужно заменить 16-ричный номер символа на символ....
01 -a
02 -b
03 -c
И так далее

anonymous
()
Ответ на: комментарий от Zulu

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

sasha999 ★★★★
()
Ответ на: комментарий от sasha999

#!/usr/bin/perl -w

@mmm=("k1 xx k2","qq k1 k1","k1 k1 k1 k1 k2 k3 k4 k4","k2 k3 k4 k1");
my %hash=("k1"=>"a1", "k2"=>"a2", "k3"=>"a3", "k4"=>"a4", "kn"=>"an");

print join "\n"=>@mmm,"\n";

print join "\n" => grep {!$_{$_}++} 
      grep {s&\b?(.*?)\b&$1?$hash{$1}?$hash{$1}:$1:""&eg} @mmm;
print "\n";

vilfred ☆☆
()
Ответ на: комментарий от sasha999

насколько я понял, без указания списка обойтичсь нельзя, так как в списке собственно содержится, что надо заменять. А нет списка - значит и заменять не надо и небылоб сабжа как такового.

Другое дело, что челу нужен отдельный файл со списком на что надо заменить, и другой файл где надо заменить... Это все называется вычислением пересечения двух массивов c последующей заменой пересекающихся частей на нужное.

Если чел сможет сформировать хеш список соответствий "что на что заменить", то код вроде написал...

Если надо заменять какиеннить суффиксы в слове, то код надо писать другой. Короче, идея - вычисление пересечений множеств, получение подмножества, сожедращегося в двух множествах и замена через хеш этого подмножества.

vilfred ☆☆
()
Ответ на: комментарий от vilfred

> Зависимость есть ну давайте заменим задачу...
> Нужно заменить 16-ричный номер символа на символ....
> 01 -a
> 02 -b
> 03 -c
> И так далее
если так то вот родил чего-то :) . тоже сыро, но идея вроде видна
sasha@as255:~$ more bbb.txt
k1k1k1 k2 k3
k2k2k1k3
sasha@as255:~$ perl -pe 's{([\d]+)}{ chr(96 + $1)}ge' < bbb.txt > ccc.txt
sasha@as255:~$ more ccc.txt
kakaka kb kc
kbkbkakc
sasha@as255:~$

sasha999 ★★★★
()
Ответ на: комментарий от sasha999

Я бы сделал с квантификатором количества, типа
perl -pe 's{([0-9A-F]{1,2})}{ chr(96 + hex($1)) }ge'

То что-то это все мне не нравится в том смысле, что последовательности из 3 симоволов типа 0AA обрабатываются как 0x0A 0x0A - т.е. нехорошо все же... Как и 00A - который в 0x00 0x0A превращается...

Наверное, у автора все же коды строго двухцифровые... И надо делать что-то типа

perl -pe 's{([0-9A-F]{2})}{ chr(96 + hex($1)) }ge'

Но я думаю, что он тут уже не появится - свою задачу он решил 8)

Zulu ★★☆☆
()
Ответ на: комментарий от anonymous

Так может тебе нужно соответствие "ASCII код символа" <-> "символ"? Тогда копай pack/unpack в Perl
perldoc -f pack

murla
()

#!/usr/bin/perl -w

BEGIN{
use strict;}

$Literal=97;
$Index=1;
open(SRC,$ARGV[0])||die("Can't open $ARGV[0]");
open(DST,">$ARGV[1]")||die("Can't open $ARGV[1]");
while(<SRC>){
$_=chr($Literal)if($_=~m/k$Index/);
print(DST "$_\n");
$Literal++;
$Index++;}
close(DST);
close(SRC);

josephson ★★
()
Ответ на: комментарий от josephson

Ещё версия: вытаскивает индексы прямо из k[i] и заменяет k[i]
на соответствующую букву в произвольном порядке:

#!/usr/bin/perl -w

BEGIN{
    use strict;}

open(SRC,$ARGV[0])||die("Can't open $ARGV[0]");
open(DST,">$ARGV[1]")||die("Can't open $ARGV[1]");
while(<SRC>){
    my $Literal=$_;
    if($Literal=~m/^k\d+/){
        $Literal=~s/k//;
	$Literal+=96;
	$Literal=chr($Literal);}
    print(DST "$Literal\n");}
close(DST);
close(SRC);

josephson ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.