2009-04-28 7 views
2

J'écris un script sur ma machine personnelle qui est connectée au serveur distant. Je pense que le serveur distant a Perl 4.0 ou version inférieure installée et c'est pourquoi il est incapable de reconnaître la même chose. Y a-t-il une alternative à la commande chomp?Comment puis-je chomp une chaîne si j'ai Perl 4?

+4

Perl 4? Sérieusement? Perl 5 est sorti depuis près de 15 ans - depuis le 17 octobre 1994, pour être précis. Vous êtes connecté à une machine qui n'a pas été mise à niveau depuis si longtemps? Je suggère de vérifier à nouveau. – Tanktalus

+0

Il existe des machines qui viennent avec Perl 4. Vous n'avez pas à l'aimer, mais c'est vrai. –

Répondre

5

Ce n'est pas un remplacement exact, mais vous pouvez essayer:

$var =~ s/\r?\n?$// 

qui dépouillera soit CRLF (DOS), LF (Unix), CR (Mac?).

L'opérateur chomp normal élimine toujours le $INPUT_RECORD_SEPARATOR actuellement défini pour l'O/S actuel.

+0

Bonne idée, mais si $ var peut contenir plusieurs lignes séparées par \ n, méfiez-vous - en fonction de la façon dont Perl 4 interprète "$" dans une regex, ce qui précède peut supprimer le premier \ n plutôt que le dernier. –

+0

Au lieu de chomping, il suffit de se débarrasser de la valeur de $ /, comme vous l'avez mentionné. –

+0

Je pensais à ça, mais je n'avais pas un ensemble de pages de manuel Perl 4 à la main pour vérifier que ça marcherait. Quoi qu'il en soit, je préfère que mes analyseurs d'entrée suivent la loi de Postel ("Soyez strict dans ce que vous produisez, et libéral dans ce que vous acceptez"), donc ma version fonctionne indépendamment du format DOS ou Unix. – Alnitak

0

Je crois que chop() a été utilisé dans pré-5 perl. Pas aussi utile que chomp() bien sûr. Si vous manipulez entrée aléatoire vous seriez probablement mieux d'utiliser une expression rationnelle, mais si vous êtes toujours l'analyse syntaxique fichier au format unix:

while (<F>) { 
    chop(); 
    do_stuff(); 
} 

Comme le commentaire ci-dessous les états, chop() supprime toujours le dernier caractère de la lvalue, pas seulement s'il s'agit d'un caractère de nouvelle ligne (ou de ce qui se trouve dans la ligne qui se termine par var). Je le savais (d'où le commentaire "pas aussi utile que chomp()") mais j'ai oublié de le taper.

+1

Pour clarifier: la différence entre chop et chomp est que chop * always * supprime le dernier caractère, qu'il s'agisse du $ INPUT_RECORD_SEPARATOR actuel ou non. – user55400

+0

Et, le séparateur d'enregistrement d'entrée pourrait être plus d'un caractère :) –

+0

Brian, quelle était alors la convention en perl4? Je ne parle vraiment que perl5, mais le code perl4 que j'ai dû réviser utilisait "chop()" comme les gens utilisent maintenant "chomp()", car ils comprenaient le format du fichier qu'ils allaient analyser. S'il était idiomatique de ne pas utiliser chop() ou d'en emballer beaucoup dans une logique de protection, pourriez-vous donner un exemple? Sinon, malgré mes downvotes, je pense que ma réponse de "chop() était l'alternative pas-bonne à chomp() dans perl4" est une réponse très valide à "Y at-il une alternative à chomp() dans perl4?" – jj33

1

Aller à la route de la côtelette est mal conseillé, je voudrais utiliser la regex, ils sont plus mantainable et transparent pour les autres. La modification habituelle de la variable d'enregistrement finira par provoquer la polution d'un paquetage médiocre et provoquer des événements étranges.

Questions connexes