2010-05-14 3 views
-5

Je suis une capture sortie d'un programme externe:Comment découper des espaces à partir de la sortie que je capture avec des retours en arrière dans Perl?

my $cmd = "grep -h $text $file2 $file1 | tail -1 | awk '{print \$NF }' "; 
    my $port_number; 
    $port_number =`$cmd`; 

    print "port No : ==$port_number=="; 

La sortie a des espaces supplémentaires autour du numéro de port:

port No : == 2323 

== 

et j'ai essayé chomp mais il ne fonctionne pas.

+5

Veuillez fournir le code avec le chomp. Que voulez-vous dire par "ça ne marche pas"? Vous avez été sur ce site assez longtemps pour savoir comment poser une question correctement. – Ether

+0

En fait, le problème est le suivant: la variable port_no a des caractères de backword et la sortie est écrasée. – joe

+0

Qu'est-ce qu'un caractère "backword"? Pouvez-vous montrer utiliser une représentation hexadécimale de la chaîne que vous obtenez? –

Répondre

4

l'un de vos problèmes est que vous n'avez pas besoin d'utiliser des commandes externes pour faire ce que vous faites. Restez à l'intérieur Perl, qui a le regex, la gestion des fichiers et fonctionnalités awk construit en:

my $last_matching_line; 
{ 
local @ARGV = ($file2, $file1); 

while(<>) 
    { 
    next unless /$text/; 
    $last_matching_line = $_; 
    } 
} 

my($port_number) = (split /\s+/, $last_matching_line)[-1]; 

print "port No : ==$port_number=="; 
2

Vous pouvez enlever tous les espaces avec ceci:

$port_number =~ s/\s+//g; 
+0

cela a mon problème – joe

+2

@joe: ... que vous n'avez toujours pas clairement indiqué. Aidez les autres afin qu'ils puissent vous aider. – Ether

-1

chomp supprime seulement le dernier saut de ligne. Essayez une regex comme ceci:

s/(?:\r?\n)*$// 
+1

En Perl 5.10 de plus tard, vous pouvez utiliser la classe de caractères '\ R' qui correspond aux fins de ligne généralisées. Ce serait alors 's/\ R + \ z //;' –

+0

Sweet, n'a pas maintenant celui-là. Mais je suppose qu'il est préférable d'être un côté sûr puisque 5.8 est toujours très populaire. – jkramer

2

Je vais essayer de lire votre esprit ici et comprendre ce que vous entendez par « sa ne fonctionne pas », en vous montrant la documentation chomp:

Cette version plus sûre de "chop" supprime toute chaîne de fin qui correspond à la valeur actuelle de $/(également appelée $ INPUT_RECORD_SEPARATOR dans le module "English"). Renvoie le nombre total de caractères supprimés de tous ses arguments.

Pour l'utiliser correctement (en supposant que vous voulez que le reste de la chaîne, pas le saut de ligne), ne prenez pas sa valeur de retour:

my $port = `$cmd`; 
chomp $port; 
print "$port\n"; 

Vous pouvez supprimer les espaces blancs entourant indésirable avec trim en le module de base String::Util:

use String::Util 'trim'; 
trim $port; 
+1

'String :: Util' n'est pas un module de base. Si nous allons installer un module CPAN, nous pouvons aussi bien utiliser celui qui fait le mieux le travail: 'String :: Strip'. Voir http://www.illusori.co.uk/perl/2010/03/05/advanced_benchmark_analysis_1.html – daxim

+0

@daxim: Module :: CoreList me dit que String :: Util a été en perl depuis 5.00x; peut-être que j'interprète mal ses résultats. – Ether

+1

Vous vous trompez: 'Scalar :: Util' ≠' String :: Util' – daxim

3

de perldoc: « Vous pouvez en fait tronquer tout ce qui est une lvalue, y compris une cession: »

Donc, vous voulez :

chomp($port_number =`$cmd`); 
Questions connexes