2009-10-25 5 views
2

Je suis l'apprentissage de Perl et de construire une application qui obtient une ligne au hasard dans un fichier en utilisant ce code:Comment supprimer une valeur aléatoire d'un tableau en Perl?

open(my $random_name, "<", "out.txt"); 
my @array = shuffle(<$random_name>); 
chomp @array; 
close($random_name) or die "Error when trying to close $random_name: $!"; 
print shift @array; 

Mais maintenant, je veux supprimer le fichier de ce nom au hasard. Comment puis-je faire ceci?

+0

Est-ce que shuffle est une fonction que vous avez écrite? –

+0

Je suppose que c'est List :: Util – DVK

+0

Je dois supprimer le nom du fichier, et DVK m'a aidé avec cela. –

Répondre

4
  1. shift supprime déjà un nom du tableau.

    Tout comme pop (un depuis le début, un depuis la fin) - Je suggère d'utiliser pop car il peut être plus efficace et étant aléatoire, vous ne vous souciez pas de ce que vous utilisez. Ou avez-vous besoin de le supprimer d'un fichier?

    Si tel est le cas, vous devez:

    A. obtenir un nombre de noms dans un fichier (si petite, lisez tout en mémoire à l'aide File::Slurp, si grand, soit lu ligne par ligne et compte ou simplement exécuter la commande wc -l $filename via des accents graves.

    B. Générer un # aléatoire de 1 à < $ de lignes> (par exemple, $random_line_number

    C. Lire la ligne de fichiers en ligne. Pour chaque ligne lue, ECRIVEZ-le dans un autre fichier temporaire (utilisez File::Temp pour générer des fichiers temporaires. Ne pas écrire la ligne numérotée $random_line_number dans un fichier texte

    D. Fermer fichier temporaire et déplacez-le au lieu de votre fichier d'origine

  2. Si la liste contient le fichier noms et vous devez supprimer le fichier lui-même (le hasard fichier), utilisez la fonction unlink(). N'oubliez pas de traiter le code retour de unlink() et, comme avec toute opération E/S, d'imprimer un message d'erreur contenant $! qui sera le texte de l'erreur système en cas d'échec.

Terminé.

D.

+0

Merci beaucoup DVK, très bien expliqué! –

2

Quand vous dites « Supprimer cette ... dans la liste » voulez-vous dire le supprimer du fichier? Si vous voulez simplement le supprimer de @array alors vous avez déjà fait cela en utilisant shift. Si vous voulez le supprimer du fichier, et l'ordre n'a pas d'importance, il suffit d'écrire les noms restants dans @array dans le fichier. Si l'ordre de fichier fait importe, vous allez devoir faire quelque chose d'un peu plus compliqué, comme rouvrir le fichier, lire les éléments dans l'ordre, sauf celui que vous ne voulez pas, puis les écrire tous ressortir à nouveau. Soit cela, ou prendre plus de préavis de la commande lorsque vous lisez le fichier.

1

Si vous avez besoin de supprimer une ligne d'un fichier (ce n'est pas tout à fait clair de votre question) l'un des moyens les plus simples et efficaces consiste à utiliser Tie::File pour manipuler un fichier comme s'il s'agissait d'un tableau. Sinon, perlfaq5 explique comment le faire le long chemin.

+0

+1 - La réponse de DVK fonctionne (il explique les étapes nécessaires pour manipuler un fichier), mais votre réponse est meilleure - moins de code à écrire et utilise une couche d'abstraction. – Ether

Questions connexes