2014-11-17 4 views
2

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

Пример: vowel1 будет подстрокой гласных, отображаемой в строке1, а гласной2 - соответствующей подстрокой строки2. Если подстрока vowel1 появляется перед гласным2 в восходящем порядке ASCII, строка string1 появляется перед строкой2 на выходе.

Я пытаюсь сделать это через хэш-таблицу, поскольку это похоже на структуру данных, которая имеет наибольший смысл.

Мой код:

#!/usr/bin/perl -w 
use strict; 

my %hash; 
my $vow = my $w; 
my $file = $ARGV[0]; 

open (IN, $file) or die "Could not open file: $!"; 

while (my $line = <IN>) { 
     $vow = ~s/[^aeiou]//g; 
     $hash{$vow}{$w} = 1; 
} 
close(IN); 

foreach my $key (sort %hash) { 
    foreach my $word (sort %{$hash {$key}}){ 
     print "$word\n"; 
    } 
} 

Когда я компилирую программу это результаты.

Use of uninitialized value $_ in substitution (s///) at sort_strings.pl line 14, <IN> line 1. 
Use of uninitialized value $w in hash element at sort_strings.pl line 16, <IN> line 1. 
Can't use an undefined value as a HASH reference at sort_strings.pl line 23. 

Я еще новичок в Perl и до сих пор путаюсь в некоторых вещах, которые вы можете и не можете сделать. Для справки о хэш-ссылке я думал, что вы можете просто ссылаться на нее с помощью%. Я видел код, который делает это с массивами.

Я знаю, что $w неинициализирован, но значение для этого случая не имеет значения.

Есть ли лучший способ сделать это, чем то, как я это делаю?

Любая помощь очень ценится.

Edit (Sample Data):

Если у меня есть текстовый файл с этими словами

albatross, 
apparate, 
fanfare, 
candelabra, 
panacea, 
vermeil, 
parmesan, 
albacore, 
false, 
beans, 

Заказ должен быть:

apparate, 
fanfare, 
panacea, 
albatross, 
albacore, 
false, 
parmesan, 
candelabra, 
beans, 
vermeil 
+2

У вас есть ошибка синтаксиса. Вместо '$ vow = ~ s/[^ aeiou] // g;' вам нужно '$ vow = ~ s/[^ aeiou] // g;' –

+1

Некоторые примеры данных были бы полезны для отладки вашего кода. – Sobrique

+0

Что такое 'my $ vow = my $ w;' - предназначенный для выполнения? Это почти наверняка не делает то, что вы думаете, что это делает. Вероятно, это источник вашего «неинициализированного значения как хэш-ref». (потому что '$ w' является' undef', когда вы вставляете его в свой хеш) – Sobrique

ответ

4

ОК, я пытаюсь это:

#!/usr/bin/perl 

use strict; 
use warnings; 

sub sort_vowelsonly { 
    my $a_vowels = $a; 
    my $b_vowels = $b; 

    $a_vowels =~ s/[^aeiou]//g; 
    $b_vowels =~ s/[^aeiou]//g; 
    print "DEBUG: Comparing $a_vowels with $b_vowels\n"; 
    return $a_vowels cmp $b_vowels 
} 

print sort { sort_vowelsonly } <DATA>; 

__DATA__ 
albatross 
apparate 
fanfare 
candelabra 
panacea 
vermeil 
parmesan 
albacore 
false 
beans 

Ключевые слова nt - пользовательская сортировка sub возвращает -1, 0 или +1 до sort. Он будет принимать любую логику внутри страны. Поэтому мы вставляем $a и $b (специальные переменные сортировки). Разделите «non vowel» и используйте функцию perl cmp, чтобы выполнить сравнение.

+0

Нет, нет! Ты прав. Заказ должен быть аппарировать, фанфары, панацеи, альбатроса, альбакора, ложных, пармезана, канделябров, бобов, алого – MipsMoreLikeWhips

+0

Это является удивительным! Это именно то, что мне нужно! Спасибо за помощь! – MipsMoreLikeWhips

2

Принимая решение Sobrique, вот, как сделать это с входным файлом, как вы хотели бы сделать вместо передачи в <DATA>, довольно просто:

#!/usr/bin/perl -w 

    use strict; 
    use warnings; 

    open my $INFILE, '<', $ARGV[0] or die $!; 

    sub sort_vowelsonly { 
    my $a_vowels = $a; 
    my $b_vowels = $b; 

    $vowels_a =~ s/[^aeiou]//g; 
    $vowels_b =~ s/[^aeiou]//g; 

    return $a_vowels cmp $b_vowels; 
    } 


    print sort { sort_vowelsonly } <$INFILE>; 


    close $INFILE; 
+0

Спасибо! – MipsMoreLikeWhips