2011-05-30 7 views
15

j'ai un code qui ressemble àComment imprimer des variables en Perl

my ($ids,$nIds); 
while (<myFile>){ 
    chomp; 
    $ids.= $_ . " "; 
    $nIds++; 
} 

Cela devrait concaténer chaque ligne dans mon myFile, et nIds devrait être mon nombre de lignes. Comment imprimer mon $ids et $nIds?

J'ai essayé simplement print $ids, mais Perl se plaint.

my ($ids, $nIds) 

est une liste, non? Avec deux éléments?

+8

-1 pour "Perl se plaint" plutôt que de partager le texte du message réel. – tadmc

Répondre

16
print "Number of lines: $nids\n"; 
print "Content: $ids\n"; 

Comment Perl s'est-il plaint? print $ids devrait fonctionner, même si vous voulez probablement un retour à la ligne, soit explicitement avec print comme ci-dessus ou implicitement en utilisant say ou -l/$\.

Si vous voulez interpoler une variable dans une chaîne et avoir quelque chose immédiatement après que le ferait ressemble à une partie de la variable mais n'est pas, placez le nom de la variable dans {}:

print "foo${ids}bar"; 
+0

hey, je me demandais juste, et si je veux imprimer quelque chose immédiatement après la variable, c'est-à-dire, je veux réaliser ceci: 'print 'Content: $ idsHeyIamhere" ' – Juto

+0

@Juto: ajouté à ma réponse – ysth

7
Comment imprimer mes $ ids et $ nIds? J'ai essayé simplement print $ids, mais Perl se plaint.

Se plaint de quoi? Valeur non initialisée? Peut-être que votre boucle n'a jamais été entrée en raison d'une erreur d'ouverture du fichier. Assurez-vous de vérifier si open a renvoyé une erreur et assurez-vous que vous utilisez use strict; use warnings;.

my ($ids, $nIds) est une liste, non? Avec deux éléments?

C'est un appel de fonction (très spécial). $ids,$nIds est une liste avec deux éléments.

9

Vous devriez toujours inclure tout le code pertinent lorsque vous posez une question. Dans ce cas, l'instruction d'impression qui est le centre de votre question. La déclaration d'impression est probablement l'élément d'information le plus crucial. Le deuxième élément d'information le plus important est l'erreur, que vous n'avez pas incluse. La prochaine fois, incluez les deux.

print $ids devrait être une déclaration assez difficile à gâcher, mais c'est possible. Raisons possibles:

  1. $ids est indéfini. Donne l'avertissement undefined value in print
  2. $ids est hors de la portée. Avec use strict, donne un avertissement fatal Global variable $ids needs explicit package name, et sinon l'avertissement non défini ci-dessus. Vous avez oublié un point-virgule à la fin de la ligne .
  3. Vous avez essayé de le faire print $ids $nIds, auquel cas perl pense que $ids est censé être un descripteur de fichier, et vous obtenez une erreur comme print to unopened filehandle.

Explications

1: ne devrait pas arriver. Il peut se produire si vous faites quelque chose comme ceci (en supposant que vous n'utilisez pas strict):

my $var; 
while (<>) { 
    $Var .= $_; 
} 
print $var; 

Donne l'avertissement pour la valeur non définie, car $Var et $var sont deux variables différentes.

2: ce qui pourrait arriver, si vous faites quelque chose comme ceci:

if ($something) { 
    my $var = "something happened!"; 
} 
print $var; 

my déclare la variable à l'intérieur du bloc en cours. En dehors du bloc, il est hors de portée.

3: Assez simple, erreur commune, facilement réparable. Plus facile à repérer avec use warnings.

4: Aussi une erreur commune. Il y a plusieurs façons d'imprimer correctement deux variables dans la même déclaration print:

print "$var1 $var2"; # concatenation inside a double quoted string 
print $var1 . $var2; # concatenation 
print $var1, $var2; # supplying print with a list of args 

Enfin, quelques perl conseils magiques pour vous:

use strict; 
use warnings; 

# open with explicit direction '<', check the return value 
# to make sure open succeeded. Using a lexical filehandle. 
open my $fh, '<', 'file.txt' or die $!; 

# read the whole file into an array and 
# chomp all the lines at once 
chomp(my @file = <$fh>); 
close $fh; 

my $ids = join(' ', @file); 
my $nIds = scalar @file; 
print "Number of lines: $nIds\n"; 
print "Text:\n$ids\n"; 

La lecture du fichier entier dans un tableau est adapté aux petits fichiers uniquement, sinon il utilise beaucoup de mémoire. Habituellement, ligne par ligne est préférée.

Variations:

  • print "@file" équivaut à $ids = join(' ',@file); print $ids;
  • $#file renverront le dernier indice dans @file. Puisque les tableaux commencent généralement à 0, $#file + 1 est équivalent à scalar @file.

Vous pouvez également faire:

my $ids; 
do { 
    local $/; 
    $ids = <$fh>; 
} 

Par temporairement « éteindre » $/, le séparateur d'enregistrement d'entrée, à savoir retour à la ligne, vous ferez <$fh> retour le fichier entier. Ce que fait vraiment <$fh> est lu jusqu'à ce qu'il trouve $/, puis retourne cette chaîne. Notez que cela préservera les nouvelles lignes dans $ids.

solution ligne par ligne:

open my $fh, '<', 'file.txt' or die $!; # btw, $! contains the most recent error 
my $ids; 
while (<$fh>) { 
    chomp; 
    $ids .= "$_ "; # concatenate with string 
} 
my $nIds = $.; # $. is Current line number for the last filehandle accessed. 
+0

Etes-vous sûr? Quand je dis '$ array [500] =" yada "' je reçois la valeur 501 pour 'scalar @ array'. – BarneySchmale

Questions connexes