J'ai fichier (node_list.txt) qui a la liste des nœuds.
print Dumper(\@list_of_hosts); my $node_file = "node_list.txt"; open(NODE_FILE, "< $node_file") or die "can't open $node_file: $!"; my $count; $count += tr/\n/\n/ while sysread(NODE_FILE, $_, 2 ** 16); print "COUNT:$count\n"; my $res = $count / scalar @list_of_ips;
3 Réponses :
Peut-être que le code suivant est conforme à vos exigences
Merci. Et si j'ai un nombre impair de lignes dans le fichier de noeud d'entrée? Ex: Si j'ai 11 nœuds dans des fichiers d'entrée et que vous avez besoin de mettre en 6 fichiers (2 dans chacun) et que la finale doit contenir 1 noeud. Est-ce possible ici?
VEUILLEZ Éviter inutilement avec Global Vars ( Node_File code>,
out code>)
Veuillez éviter d'inutilement en utilisant 2-arg ouvert code>
Il n'y a pas besoin de chomp code>.
Plus important encore, cela ne fonctionne que s'il y a exactement 5 ou 6 nœuds dans le fichier d'entrée. (4 Le 2/2/0 au lieu des 2/1/1 et 7 fait 2/2/2 au lieu du 3/2/2.)
@ikegami - Fonctionne bien pour 11 lignes dans le fichier d'entrée, crée 6 fichiers [5 fichiers avec 2 lignes et enfin avec 1 ligne uniquement]. (Node_file, out) - Je suis une vieille école, je suis examiné sur Doc pour Ouvrir B> et, en effet, il n'est pas recommandé. Si CHOMP B> n'est pas utilisé, alors Dumper (@nodes) B> Imprime Extra "\ n" b> dans sa sortie et dans les fichiers de sortie entre chaque ligne sera une ligne vide. Une telle sortie correspond-elle souhaitée par l'auteur?
Il ne devrait créer que 3 fichiers. Le nombre de fichiers à créer est la partie fixe (car le nombre d'hôtes est fixe), pas le nombre de lignes par fichier. (Désolé, le dernier commentaire a décrit le problème de manière incorrecte, mais le problème est réel.)
@ VINODK89 - Est-il difficile d'ajouter quelques lignes dans le fichier d'entrée et de voir quel sera le résultat? N'ayez pas peur d'expérimenter et d'observer ce qui sera le résultat - c'est la première règle de la science observer / expérimenter et apprendre b>.
Est-ce que l'article original indique qu'il ne devrait y avoir que 3 fichiers de sortie? Cela indique-t-il quel contenu est pour @List_of_ips b>. Je ne peux pas lire l'esprit de l'affiche et je dois improviser le code de travail.
@ VINODK89 - J'ai ajusté le code pour inclure les hôtes pour distribuer entre B>. À l'avenir, essayez de décrire un problème de cette manière qui serait facile à comprendre.
@ikegami - Je devais utiliser dire {$ out} $ node_name; b> à imprimer dans un fichier! Je dirais que c'est tout à fait étrange b> manière. Pour moi, je n'ai pas travaillé dire $ fh $ node_name; b> ni SAY $ FH, $ node_name b>. Et je suis tombé sur la suite pour utiliser le fichierHandle sans une liste pour imprimer le contenu de $ _ à celui-ci, vous devez utiliser un fichier Bareworddhandle comme FH, et non un indirect comme $ fh. CODE> - CODE> - CODE> = "https://perldoc.perl.org/functions/say.html" rel = "nOfollow noreferrer"> perdoc.perl.org/functions/say.html
@ikegami - Perl -V Résumé de mon Perl5 (Révision 5 Version 30 Subversion 0)
Cela signifie simplement que vous ne pouvez pas utiliser day $ fh; code> pour signifier
dire $ fh $ _; code>, mais vous pouvez utiliser le plus définitivement
dire $ fh $ _; code>. (
Perl -e'use fonction QW (disons); $ _ = "abc"; mon $ fh = \ * stdout; dites; dites $ fh; dites $ fh $ _; ' code> )
(Veuillez utiliser des backticks pour le code, mais des astérisques doublés.)
@ikegami - metacpan.org/pod/perl6::Say - Section Les bugs et les irritations b> Perl 5 ne peuvent pas reproduire avec Say B> caractéristique de Imprimer B> (regardez en bas).
Ok, je pensais que vous parliez de l'opérateur code>. Vous avez même lié à l'opérateur code> code> dans le commentaire initial. Pourquoi parlez-vous soudainement de certains sous dans un module CPAN?
@ikegami - Je n'ai commencé que d'utiliser dire code> et tenté de sortir dans un fichier, il a immédiatement produit un fichier vide. Hmm, pourquoi est-ce? Commencé à lire la documentation et a constaté que, dans mon cas, je devais utiliser
dire {$ fh} $ données; code> pour diriger des données dans un fichier. Maintenant, chaque nouveau script Perl doit ajouter
Utiliser la fonctionnalité "Dites" code> (gêne) et comment imprimer des données sans
"\ n" code> ajouté?
Re " a commencé à lire la documentation et constaté que dans mon cas, je devais utiliser dire {$ fh} $ données; code> pour diriger des données dans un fichier. I>", non . Ce n'est pas ce que dit le passage (puisque l'utilisation fournit quelque chose pour
list code>). Voir mon commentaire précédent pour plus de détails.
Re " Maintenant, chaque nouveau script Perl doit ajouter une fonctionnalité d'utilisation" Dites "(gênance) et comment imprimer des données sans" \ n "ajouté? I>" ou Utilisez V5.10; code> ou
utilise myCustom; code> ou utilisez
noyau :: dis code> (5.12+). Mais oui. Pour des raisons de compatibilité ascendante.
@ikegami - Dans mon cas Utiliser la fonctionnalité "Dites"; code> n'était pas dans le code, mais
Utiliser des données :: Dumper; code>. Le
dire code> dans le code n'a produit aucune erreur ni avertissement - comme le résultat des fichiers de sortie était vide. Actuellement, j'ai testé avec
Utiliser la fonctionnalité "Dites"; code>, les fichiers ont été dirigés dans leur contenu. Comment devrait-on considérer cette situation car elle a créé une certaine confusion?
Veuillez fournir une démonstration minimale et exécutable du problème. ... pas dans les commentaires, mais ici
@ikegami - J'ai testé avec un code minimal et l'erreur ne s'est pas manifestée. Ok, va essayer de le faire sur le code d'origine (code de cette question) et si le problème se manifeste, je soumette de nouveaux dire code> question associée.
@ikegami - Je suppose que cela pourrait être partiellement mon erreur. J'ai essayé différentes variations et assurez-vous que dites $ FH, $ données; code> ne stocke pas les données dans un fichier. J'ai essayé
dire $ FH $ Data $ code> with Out
Utiliser la fonctionnalité "Dites"; code> mais avec
Utiliser des données :: Dumper; code> et les fichiers étaient vides. Actuellement, j'ai fait la même chose et les fichiers obtiennent leur contenu - je suis perplexe car je n'ai rien changé d'autre. Hmm?
@ikegami - Ce serait bien si la page DOC pour indique code> incluse un exemple avec un fichier indirecthandle
$ fh code>. perdoc.perl.org/functions/say.html
node_list_file_1.txt -------------------- nod_1 nod_4 node_list_file_2.txt -------------------- nod_2 nod_5 node_list_file_3.txt -------------------- nod_3
Merci @ikerami. Donc, dans votre première solution, je devrais stocker tout le contenu de la ligne de fichier d'entrée sur @lines code>. Dans la deuxième solution, pouvez-vous élaborer ce que cette condition signifie
$ fhs [($. - 1)% @fhs] -> Imprimer ($ _) tandis que <>; code> et comment puis-je prendre un fichier d'entrée?
<> code> est court pour
readline (argv) code>, et
argv code> est un Poignée spéciale qui lit des fichiers dont les chemins sont dans
@argv code> ou depuis
stdin code> si
@argv code> est vide. En bref, il agit comme pratiquement tous les programmes UNIX (par exemple,
cat code>,
grep code>, etc) n'hésitez pas à utiliser une poignée différente.
... et pendant que <> code> est court pour
tout en défini ($ _ = <>) code>
Dans les deux cas, si nous mentionnons $ num_buckets = 3; code> alors il créera 3 fichiers évidemment. Mais si je n'ai que 2 lignes de données dans
node_list.txt code> disons
nod_1 code>
node_2 code> et il devrait créer 2 fichiers seulement? Depuis sa création de 3ème fichier aussi avec des données vides dedans. Comment l'éviter?
En utilisant la première approche, vérifiez simplement si le nombre de lignes à imprimer est zéro. /// Utilisation du second, c'est un peu plus compliqué. Vous devez retarder la création du fichier jusqu'à ce qu'il soit nécessaire. Vous utiliseriez quelque chose comme $ fh [$ i] // = do {...}; code> dans la boucle.
Bonne idée. Je suis durable la boucle lorsque $ num_lines code> atteint
0 code>. I.e.,
dernier si ($ num_lines == 0); code>.
Ceci divise les lignes de sorte que chaque fichier sauf le dernier reçoit le nombre maximum égal, par lequel le dernier obtient le reste. Donc, avec 10 lignes pour scinder plus de 3 fichiers, ils vont comme 4-4-2. † sup> notes p> Le Si le nombre de fichiers à écrire ne divisez pas uniformément le nombre de lignes à scinder entre eux, nous avons besoin d'une ligne de plus dans chaque fichier (et le dernier reçoit le reste) P> li>
Le tableau avec des lignes est successivement J'ouvre tous les fichiers de sortie nécessaires et stockez les fichiers de fichiers dans un tableau afin de rédiger plus facilement des morceaux de lignes dans leurs fichiers. Ce n'est en aucun cas nécessaire, comme on peut itérer sur Lorsque vous écrivez sur un fichier de fichiers qui doivent être évalués à partir d'une expression plus complexe qui, juste un scalaire de base, nous devons l'avoir dans un bloc, comme Si vous stockez des poignées dans un tableau ou un hachage, ou en général chaque fois que vous utilisez une expression plus complexe qu'une poignée de marque nomme ou une variable scalaire simple et non subcédente pour la récupérer, vous devrez utiliser un retour de blocage. la valeur du fichierHandle à la place [...] p>
blockQuote>
voir Cet article pour une autre solution et plus de discussion. P> Li>
ul> † sup> Si la distribution des lignes doit être de 4-3-3 dans ce cas, ainsi divisée aussi uniformément que possible, le code ci-dessus doit être modifié comme p> Le reste est le même. p> p>
<> code> lit toutes les lignes à partir de fichiers soumis à la ligne de commande p> li>
épissure code> -ed, afin de générer des morceaux de lignes qui entreront dans un fichier chacun, de sorte qu'il finit par vidé de vider p> li >
@chunks code> et ouvrir un fichier et l'écrire pour chaque groupe ("chunk") de lignes p> li>
{$ fhs_out [$ i]} code>} code>} code> . De Imprimer P>
Ouvrez les fichiers de sortie, stockez les poignées dans un tableau. Trouvez le fichier d'entrée, écrivez chaque ligne dans le fichier approprié en fonction de la matrice. Continuez jusqu'à fini. Notez que vous n'avez pas besoin de savoir à quel point le fichier d'entrée est grand (combien de lignes contenues); Vous n'avez besoin que de savoir combien de fichiers de sortie souhaitez-vous.
De plus, vous devriez éviter le style Node_File
Node_File à l'ancienne Code> Poignées de fichier et utilisez des poignées de fichier lexicalement scopées:
Ouvrez mon $ FH, "<", $ nœud_file ou mourir; code>
Pour vérifier ce qui doit être fait lorsque le nombre de fichiers à écrire ne divisez pas uniformément le nombre de lignes: pour 10 lignes pour casser dans 3 fichiers Avez-vous besoin de lignes par fichier sous 4-4-2 ou 4-3-3?
@zdim, ou mettre différemment, s'il y avait 5 hôtes et 26 nœuds, 6-5-5-5-5 ou 6-6-6-6-2? (Personnellement, je ne vois pas comment ce dernier est proche du "égal" de l'OP demandée. Mais je vais vous donner l'avantage du doute pour le moment)
@ikegami Oui, un exemple encore meilleur. Bien qu'ils disent effectivement «nombre égal de parties» (ce que j'ai oublié au début), c'est un peu mince pour une spécification, donc j'ai demandé une confirmation.
@zdim: selon le calcul s'il y a 10 éléments mis en 3 fichiers, puis 10/3 = 3. Finalement, 4-3-3 est bon d'aller.
Vinodk89, je pense que @zdim est intéressé à savoir si 4-4-2 est également acceptable.
" 4-3-3 est bon d'aller i>" - merci, j'ai édité mon message pour tenir compte de cela. (Je quitte toujours le code 4-4-2 à l'avance au cas où il est peut-être aussi bon pour votre objectif. Si cette division 4-4-2 est en fait inutile, je modifierai à nouveau)