Latest web development tutorials

Perl sous-programme (fonction)

Perl sous-programme qui est fonction définie par l'utilisateur.

Perl sous-programme qui est un morceau de code pour effectuer des tâches spéciales de séparation, il peut faire pour réduire la duplication de code et de rendre le programme facile à lire.

Perl sous-programme peuvent apparaître partout dans le programme, la syntaxe est la suivante:

sub subroutine{
   statements;
}

Subroutine syntaxe d'appel:

subroutine( 参数列表 );

Perl 5.0 dans les versions sous-routine appel suivant comme suit:

&subroutine( 参数列表 );

Dans la nouvelle version, même si elle prend en charge la méthode d'appel, mais pas recommandé.

Ensuite, nous regardons est un exemple simple:

#!/usr/bin/perl

# 函数定义
sub Hello{
   print "Hello, World!\n";
}

# 函数调用
Hello();

Le programme ci-dessus, le résultat est:

Hello, World!

Passage de paramètres aux sous-programmes

Perl sous-programme peut accepter plusieurs paramètres et d'autres programmes, utilisez les tableaux @_ paramètres spéciaux de sous-programmes indiqués.

Ainsi, le sous-programme premier argument est $ _ [0], le second argument est $ _ [1], et ainsi de suite.

Que les paramètres sont de type scalaire ou un tableau, l'utilisateur du paramètre passé à la sous-routine, perl défaut par la référence les appeler.

#!/usr/bin/perl

# 定义求平均值函数
sub Average{
   # 获取所有传入的参数
   $n = scalar(@_);
   $sum = 0;

   foreach $item (@_){
      $sum += $item;
   }
   $average = $sum / $n;
   print '传入的参数为 : ',"@_\n";           # 打印整个数组
   print "第一个参数值为 : $_[0]\n";         # 打印第一个参数
   print "传入参数的平均值为 : $average\n";  # 打印平均值
}

# 调用函数
Average(10, 20, 30);

Le programme ci-dessus, le résultat est:

传入的参数为 : 10 20 30
第一个参数值为 : 10
传入参数的平均值为 : 20

L'utilisateur peut changer la valeur des paramètres réels correspondant en changeant les valeurs dans le tableau @_.

Passé à la liste de sous-programme

Depuis @_ variable est un tableau, il peut donc passer la liste pour le sous-programme.

Mais si nous avons besoin de passer un scalaire et un tableau des paramètres, vous devez inscrire sur le dernier paramètre, comme suit:

#!/usr/bin/perl

# 定义函数
sub PrintList{
   my @list = @_;
   print "列表为 : @list\n";
}
$a = 10;
@b = (1, 2, 3, 4);

# 列表参数
PrintList($a, @b);

Le programme ci-dessus va fusionner le scalaire et un tableau de résultats de sortie:

列表为 : 10 1 2 3 4

Nous pouvons passer à des sous-programmes multiples tableaux et hachages, mais s'il est passé plusieurs tableaux et hachages, va conduire à la perte d'une identité indépendante. Nous avons donc besoin d'utiliser la référence (la section suivante présentera) pour passer.

Hash passé à un sous-programme

Lorsque la table de hachage est passé à la sous-routine, il sera copié à @_ dans la table de hachage sera d'élargir la liste des paires clé / valeur.

#!/usr/bin/perl

# 方法定义
sub PrintHash{
   my (%hash) = @_;

   foreach my $key ( keys %hash ){
      my $value = $hash{$key};
      print "$key : $value\n";
   }
}
%hash = ('name' => 'w3big', 'age' => 3);

# 传递哈希
PrintHash(%hash);

La sortie de l'exécution du programme ci-dessus est la suivante:

age : 3
name : w3big

valeur de retour Subroutine

Un sous-programme peut être comme d'autres langages de programmation utilisent l'instruction de retour pour renvoyer des valeurs.

Si aucune déclaration de retour, puis la dernière ligne de la déclaration de sous-programme que la valeur de retour.

#!/usr/bin/perl

# 方法定义
sub add_a_b{
   # 不使用 return
   $_[0]+$_[1];  

   # 使用 return
   # return $_[0]+$_[1];  
}
print add_a_b(1, 2)

La sortie de l'exécution du programme ci-dessus est la suivante:

3

Subroutine nous pouvons revenir scalaires, des tableaux et hachages, mais en retour, plusieurs tableaux et hachages, va conduire à la perte d'une identité indépendante. Nous avons donc besoin d'utiliser la référence (la section suivante présentera) pour revenir plusieurs tableaux et les fonctions.


variables privées Subroutine

Par défaut, Perl, toutes les variables sont des variables globales, ce qui signifie que la variable peut être appelée à partir de n'importe où dans le programme.

Si nous avons besoin de définir des variables privées, utilisermon opérateur de régler.

mon opérateur crée des variables de portée lexicale, les variables créées avec masurvie dans le début de l'instruction jusqu'à la fin de la portée de clôture.

Champ d'application se réfère à la fermeture peut être dans la région des accolades paire peut être un fichier, peut aussi être un si, alors que, pour, foreach, string eval.

L'exemple suivant montre comment déclarer une ou plusieurs variables privées:

sub somefunc {
   my $variable; # $variable 在方法 somefunc() 外不可见
   my ($another, @an_array, %a_hash); #  同时声明多个变量
}
#!/usr/bin/perl

# 全局变量
$string = "Hello, World!";

# 函数定义
sub PrintHello{
   # PrintHello 函数的私有变量
   my $string;
   $string = "Hello, w3big!";
   print "函数内字符串:$string\n";
}
# 调用函数
PrintHello();
print "函数外字符串:$string\n";

La sortie de l'exécution du programme ci-dessus est la suivante:

函数内字符串:Hello, w3big!
函数外字符串:Hello, World!

variables d'affectation temporaire

Nous pouvons utiliser les valeurs temporaires locales pour les variables globales, la portée de la valeur initiale après la sortie est également de retour.

variables locales définies dans le programme principal n'existe pas, mais il existe dans le sous-programme et l'appel sous-programme de sous-programme. Lorsque vous définissez peut donner une valeur, tels que:

#!/usr/bin/perl

# 全局变量
$string = "Hello, World!";

sub Printw3big{
   # PrintHello 函数私有变量
   local $string;
   $string = "Hello, w3big!";
   # 子程序调用的子程序
   PrintMe();
   print "Printw3big 函数内字符串值:$string\n";
}
sub PrintMe{
   print "PrintMe 函数内字符串值:$string\n";
}

sub PrintHello{
   print "PrintHello 函数内字符串值:$string\n";
}

# 函数调用
Printw3big();
PrintHello();
print "函数外部字符串值:$string\n";

La sortie de l'exécution du programme ci-dessus est la suivante:

PrintMe 函数内字符串值:Hello, w3big!
Printw3big 函数内字符串值:Hello, w3big!
PrintHello 函数内字符串值:Hello, World!
函数外部字符串值:Hello, World!

Les variables statiques

fonction des opérateurs de l'Etat est similaire à modificateur statique C, les mots clés de l'Etat deviendront variables locales persistantes.

état des variables aussi lexicales, seule la définition du domaine variable lexicale est valide, par exemple:

#!/usr/bin/perl

use feature 'state';

sub PrintCount{
   state $count = 0; # 初始化变量

   print "counter 值为:$count\n";
   $count++;
}

for (1..5){
   PrintCount();
}

La sortie de l'exécution du programme ci-dessus est la suivante:

counter 值为:0
counter 值为:1
counter 值为:2
counter 值为:3
counter 值为:4

Note 1: l'état ne peut créer une des variables fermées-scope à l'intérieur du sous-programme.

Note 2: état est introduit à partir de Perl 5.9.4, il doit être ajouté avant de l'utiliser à utiliser.

Note 3: Etat peut déclarer scalaire, tableau, hachage. Mais lors de la déclaration des tableaux et hachages, vous ne pouvez pas l'initialiser (au moins Perl 5.14 est pas pris en charge).


contexte d'appel Subroutine

appels Subroutine, il sera de retour aux valeurs de différents types en fonction du contexte, comme le localtime () suivante sous-programme dans un contexte scalaire renvoie la chaîne dans un contexte de liste retourne une liste:

#!/usr/bin/perl

# 标量上下文
my $datestring = localtime( time );
print $datestring;

print "\n";

# 列表上下文
($sec,$min,$hour,$mday,$mon, $year,$wday,$yday,$isdst) = localtime(time);
printf("%d-%d-%d %d:%d:%d",$year+1990,$mon+1,$mday,$hour,$min,$sec);

print "\n";

La sortie de l'exécution du programme ci-dessus est la suivante:

Sun Jun 12 15:58:09 2016
2106-6-12 15:58:9