Traduction d'une fonction PERL en PHP

Résolu
cds0671 Messages postés 18 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 17 novembre 2009 - 2 juil. 2009 à 09:08
cds0671 Messages postés 18 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 17 novembre 2009 - 6 juil. 2009 à 11:05
Bonjour,

Quelqu'un pourrait-il m'aider à traduire cette fonction perl en language PHP ? Merci pour votre aide!!

sub long_string {

my $str = shift;
my $limit = 255;

# Return short strings
return $str if length $str <= $limit;

# Split the line at word boundaries where possible my @segments $str~ m[.{1,$limit}$|.{1,$limit}\b|.{1,$limit}]sog;

# Join the string back together with quotes and Excel concatenation
$str = join '"&"', @segments;

# Add formatting to convert the string to a formula string
return $str = qq(="$str");
}





csd0671

4 réponses

nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 1
3 juil. 2009 à 14:47
bonjour,
public function long_string( $str '', $limit 255 )

{

   if ( strlen( $str ) <= $limit )

      return $str

   $words = explode( ' ', $str ) ;

   $seg = '' ;

   $segs = aray() ;

   foreach ( $words as $word ) {

      if ( ( strlen( $seg ) + strlen( $word) + 1 ) <= $limit ) {

        $seg .= $word . ' ' ;

      } else {

        $segs[] = $seg ;

        $seg = $word ;

      }

    }

    return implode( '&', $segs ) ;

}
3
cds0671 Messages postés 18 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 17 novembre 2009
6 juil. 2009 à 09:44
Bonjour nautilus et merci beaucoup pour ton aide.
J'ai juste quelques précisions à te demander !
Je ne comprend pas tout à fait ce que réalise ta boucle for each ? pourrais tu stp mettre des commentaires aux lignes de codes, car par exemple lors de l'appel de la fonction tu note   long_string( $str '', $limit 255 )
$str='' !!! ça change quoi par rapport lorsqu'on passe $str tout simplement ?? c'est quoi la différence?

Cette fonction doit pouvoir me permettre de faire une extraction Excel en contournant le problème des 255 caractères max par cellule, pour celà j'utilise les class "writeexcel" et je dois retourner une formule et donc mettre un égale devant la chaine retournée !! comment dois-je faire stp ?

Merci vraiment pour ton aide

csd0671
0
nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 1
6 juil. 2009 à 10:37
Bonjour,

Et lerci pour les commentaires... et pour les précisions, bien que commenter un code PHP aussi basic ne soit pas évident:
function long_string( $str '', $limit 255 )

Bien que PHP, comme la plupart des langages interprétés, n'impose pas l'initialisation des variables ou paramètres, je garde la bonne vielle habitude du C et C°°, à savoir toujours initialiser une varaible et toujours donner une valeur par défaut à un paramètre. Par rapport à la simple déclaration de nom, on a pour seul changement que même en cas d'appel de la fonction sans lui passer d eparamètres, on a une chaine vide en tant qu evaleur de chaine. De plus, en nommant et initialisant les paramètres, on obtient dans l'appel de la fonction, un équivalent des 2 variables locales my du Perl.

$words = explode( ' ', $str ) ;

foreach ( $words as $word ) {

La boucle foreach de PHP est identique à celle du Perl. Ici, on a transformé la chaine passée en entrée en un tableau de mots, le explode étant sur le caractère espace.

if ( ( strlen( $seg ) + strlen( $word) + 1 ) <= $limit ) {

        $seg .= $word . ' ' ;

      } else {

        $segs[] = $seg ;

        $seg = $word . ' ' ; // espace rajouté après relecture

      }

On commence par tester si la longueur du segment de chaine en cours + la longueur du mot courant + l'espace reste < à 255 caractères.

Si oui, on rajoute le mot plus un espace au segment courant.

Sinon, on insère le segment courant à la fin du tableau des segments et on initialise le segment courant avec le mot (et un espace, désolé, je l'avais oublié lors de l'écriture rapide de ton équivalence).

Enfin, pour retourner une chaine avec un "=" devant, il suffit, dans le return d eta fonction, de concaténer l'ensemble avec l'opérateur de concaténation de chaine d ePHP, le '.', ce qui donne:

return '=' . implode( '&', $segs ) ;

La syntaxe de PHP est assez directe et très compréhensible, pour peu que l'on ait de bonnes bases en C/C++, voire en Perl, PHP ayant largement emprunté à ces langages dans sa définition.
0
cds0671 Messages postés 18 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 17 novembre 2009
6 juil. 2009 à 11:05
Super merci beaucoup mais j'ai encore une question désolé loll

Lorsque ma chaine de caractère est supérieure à 255, je ne comprend pas mais lorsque je fait un echo implode(', ',$segs); par exemple pour tester,
ce que je récupère c'est uniquement les 255 premiers caractères pas les suivants ? pourrait tu stp me dire pr quoi ?

Merci encore pour ton aide, vraiment merci beaucoup

csd0671
0
Rejoignez-nous