Something about Perl (4) 流程控制

    技术2022-05-11  69

    unless结构可以看作ifnot()

    until可以看作while_not()适当使用这两种结构可以简化条件判断表达式

    在perl中执行系统命令$result = `/bin/ps`;

    一个用perl写的脚本,用于杀死系统中后台运行的perl程序

          1 #!/usr/bin/perl -w      2      3 my $PS = `/bin/ps`;      4      5 if ($PS =~ m/^([0-9]+).*perl/m)      6     {      7     print $1."/n";      8     my $ret=`kill -n 9 $1`; #Send terminate signal      9     }     10 print $PS;只能杀掉第一个perl运行的程序

    表达式修饰符print "$n is a negative number./n" if $n < 0; #注意中间除了空格没有别的分隔符与    if ($n < 0) {      print "$n is a negative number./n";    }等效虽然条件表达式在书写上是在语句末尾,仍然整行中最先执行的!!

    循环语句也可以写作这种形式    $i *= 2 until $i > $j;    print " ", ($n += 2) while $n < 10; #注意print和后一条语句之间是逗号!说明他们在同一个循环块中后面一条语句等价于:    while ($n < 10) {      print " ", ($n += 2);    }

    foreach作为表达式修饰符使用时只能使用$_作为循环变量如果需要自定义循环变量,只能用传统的写法

    语句块中的局部变量仅在语句块中有效    {      print "Please enter a number: ";      chomp(my $n = <STDIN>);      my $root = sqrt $n;  # calculate the square root      print "The square root of $n is $root./n";    }这里$n和$root在语句块外不再有效

    注意在perl中elsif的拼写    if ( ! defined $dino) {      print "The value is undef./n";    } elsif ($dino =~ /^-?/d+/.?$/) {      print "The value is an integer./n";    } elsif ($dino =~ /^-?/d*/./d+$/) {      print "The value is a _simple_ floating-point number./n";    } elsif ($dino eq '') {      print "The value is the empty string./n";    } else {      print "The value is the string '$dino'./n";    }

    自增自减操作符    my $m = 5;    my $n = ++$m;   # increment $m to 6, and put that value into $n    my $c = --$m;   # decrement $m to 5, and put that value into $c

        my $d = $m++;   # $d gets the old value (5), then increment $m to 6    my $e = $m--;   # $e gets the old value (6), then decrement $m to 5

    last操作符直接跳出循环体,类似C语言中的break    # Print all input lines mentioning fred, until the _ _END_ _ marker    while (<STDIN>) {      if (/_ _END_ _/) {        # No more input on or after this marker line        last;      } elsif (/fred/) {        print;      }    }    ## last comes here ##

    next操作符跳过本轮以下所有语句,直接开始下一轮循环是否进行的判断,类似C语言中的continue    # Analyze words in the input file or files    while (<>) {      foreach (split) {  # break $_ into words, assign each to $_ in turn        $total++;        next if //W/;    # strange words skip the remainder of the loop        $valid++;        $count{$_}++;    # count each separate word        ## next comes here ##      }    }

        print "total things = $total, valid words = $valid/n";    foreach $word (sort keys %count) {      print "$word was seen $count{$word} times./n";    }

    redo操作符返回本轮循环语句块顶端,在C语言中没有类似操作符    # Typing test    my @words = qw{ fred barney pebbles dino wilma betty };    my $errors = 0;

        foreach (@words) {      ## redo comes here ##      print "Type the word '$_': ";      chomp(my $try = <STDIN>);      if ($try ne $_) {        print "Sorry - That's not right./n/n";        $errors++;        redo;  # jump back up to the top of the loop      }    }    print "You've completed the test, with $errors errors./n";

    综合使用三个操作符的例子:    foreach (1..10) {      print "Iteration number $_./n/n";      print "Please choose: last, next, redo, or none of the above? ";      chomp(my $choice = <STDIN>);      print "/n";      last if $choice =~ /last/i;      next if $choice =~ /next/i;      redo if $choice =~ /redo/i;      print "That wasn't any of the choices... onward!/n/n";    }    print "That's all, folks!/n";

    逻辑与 && and逻辑或 || or

    利用逻辑语句设置默认值my $last_name = $last_name{$someone} || '(No last name)';如果someone没有在hash中,则被设置为No Last name

    问号三元操作符expression ? if_true_expr : if_false_expr求平均值    my $average = $n ? ($total/$n) : "-----";    print "Average: $average/n";如果n未定义或者为0, 结果为-----

    利用and or操作符进行流程控制($m < $n) && ($m = $n);等价于if ($m < $n) { $m = $n }

    而($m<$n) || ($m =$n);等价于until ($m < $n) { $m = $n }

    在perl中打开文件的常用方法:    open CHAPTER, $filename      or die "Can't open '$filename': $!";

     

     

     

     


    最新回复(0)