Je travaille actuellement sur un code qui change certains mots en mots shakespeariens. Je dois extraire les phrases qui contiennent les mots et les imprimer dans un autre fichier. J'ai dû supprimer .START au début de chaque fichier.Comment trouver la position d'un mot en utilisant un compteur?
D'abord je diviser les fichiers avec le texte par des espaces, alors maintenant j'ai les mots. Ensuite, j'ai itéré les mots à travers un hachage. Les clés et les valeurs de hachage proviennent d'un fichier délimité par des tabulations structuré comme suit, OldEng/ModernEng (lc_Shakespeare_lexicon.txt
). En ce moment, j'essaie de comprendre comment trouver la position exacte de chaque mot anglais moderne trouvé, changez-le en shakespearien; Ensuite, trouvez les phrases avec les mots de changement et imprimez-les dans un fichier différent. La majeure partie du code est terminée sauf pour cette dernière partie. Voici mon code à ce jour:
#!/usr/bin/perl -w
use diagnostics;
use strict;
#Declare variables
my $counter=();
my %hash=();
my $conv1=();
my $conv2=();
my $ssph=();
my @text=();
my $key=();
my $value=();
my $conversion=();
my @rmv=();
my $splits=();
my $words=();
my @word=();
my $vals=();
my $existingdir='/home/nelly/Desktop';
my @file='Sentences.txt';
my $eng_words=();
my $results=();
my $storage=();
#Open file to tab delimited words
open (FILE,"<", "lc_shakespeare_lexicon.txt") or die "could not open lc_shakespeare_lexicon.txt\n";
#split words by tabs
while (<FILE>){
chomp($_);
($value, $key)= (split(/\t/), $_);
$hash{$value}=$key;
}
#open directory to Shakespearean files
my $dir="/home/nelly/Desktop/input";
opendir(DIR,$dir) or die "can't opendir Shakespeare_input.tar.gz";
#Use grep to get WSJ file and store into an array
my @array= grep {/WSJ/} readdir(DIR);
#store file in a scalar
foreach my $file(@array){
#open files inside of input
open (DATA,"<", "/home/nelly/Desktop/input/$file") or die "could not open $file\n";
#loop through each file
while (<DATA>){
@text=$_;
chomp(@text);
#Remove .START
@rmv=grep(!/.START/, @text);
foreach $splits(@rmv){
#split data into separate words
@word=(split(/ /, $splits));
#Loop through each word and replace with Shakespearean word that exists
$counter=0;
foreach $words(@word){
if (exists $hash{$words}){
$eng_words= $hash{$words};
$results=$counter;
print "$counter\n";
$counter++;
#create a new directory and store senteces with Shakespearean words in new file called "Sentences.txt"
mkdir $existingdir unless -d $existingdir;
open my $FILE, ">>", "$existingdir/@file", or die "Can't open $existingdir/conversion.txt'\n";
#print $FILE "@words\n";
close ($FILE);
}
}
}
}
}
close (FILE);
close (DIR);
Pourriez-vous poster des données d'entrée? – fugu
Vous perdez certains des avantages de 'my' en déclarant les variables avant qu'elles ne soient nécessaires. En outre, toutes ces affectations (sauf 'my $ existingdir = '/ home/nelly/Desktop'; my @ file = 'Sentences.txt';') sont inutiles. – ikegami
Très probablement, vous allez utiliser 'index'' pos' et autres - comme dans cette [SO similaire question (jetez un oeil sur les réponses)] (http://stackoverflow.com/a/4856558/2019415) . Je ne sais pas si vous configurez votre recherche '% hash' correctement ici cependant. Essayez d'utiliser ['Data :: Dumper'] (https://metacpan.org/pod/Data::Dumper) ou [' Data :: Printer'] (https://metacpan.org/release/Data-Printer) pour voir comment il est rempli. –