设为首页 收藏本站
查看: 1050|回复: 0

[经验分享] perl教程 学习总结

[复制链接]

尚未签到

发表于 2018-9-1 08:12:23 | 显示全部楼层 |阅读模式
  perl教程
  第一节:
  基本上,简单变量就是一个数据单元,这个单元可以是数字或字符串。
  一、整型
  1、整型
  PERL最常用的简单变量,由于其与其它语言基本相同。
  例:
  $x = 12345;
  if (1217 + 116 == 1333) {
  # statement block goes here
  }
  整型的限制:
  PERL实际上把整数存在你的计算机中的浮点寄存器中,所以实际上被当作浮点数看待。在多数计算机中,浮点寄存器可以存贮约16位数字,长于此的被丢弃。整数实为浮点数的特例。
  2、8进制和16进制数
  8进制以0打头,16进制以0x打头。
  例:$var1 = 047; (等于十进制的39)
  $var2 = 0x1f; (等于十进制的31)
  二、浮点数
  如 11.4 、 -0.3 、.3 、 3. 、 54.1e+02 、 5.41e03
  浮点寄存器通常不能精确地存贮浮点数,从而产生误差,在运算和比较中要特别注意。指数的范围通常为-309到+308。
  例:
  #!/usr/local/bin/perl
  $value = 9.01e+21 + 0.01 - 9.01e+21;
  print ("first value is ", $value, "\n");
  $value = 9.01e+21 - 9.01e+21 + 0.01;
  print ("second value is ", $value, "\n");
  ---------------------------------------------------------
  $ program3_3
  first value is 0
  second value is 0.01
  三、字符串
  惯用C的程序员要注意,在PERL中,字符串的末尾并不含有隐含的NULL字符,NULL字符可以出现在串的任何位置。
  . 双引号内的字符串中支持简单变量替换,例如:
  $number = 11;
  $text = "This text contains the number $number.";
  则$text的内容为:"This text contains the number 11."
  .双引号内的字符串中支持转义字符
  Table 3.1. Escape sequences in strings.
  Escape Sequence Description
  \a Bell (beep)
  \b Backspace
  \cn The Ctrl+n character
  \e Escape
  \E Ends the effect of \L, \U or \Q
  \f Form feed
  \l Forces the next letter into lowercase
  \L All following letters are lowercase
  \n Newline
  \r Carriage return
  \Q Do not look for special pattern characters
  \t Tab
  \u Force next letter into uppercase
  \U All following letters are uppercase
  \v Vertical tab
  \L、\U、\Q功能可以由\E关闭掉,如:
  $a = "T\LHIS IS A \ESTRING"; # same as "This is a STRING"
  .要在字符串中包含双引号或反斜线,则在其前加一个反斜线,反斜线还可以取消变量替换,如:
  $res = "A quote \" and A backslash \\";
  $result = 14;
  print ("The value of \$result is $result.\n")的结果为:
  The value of $result is 14.
  .可用\nnn(8进制)或\xnn(16进制)来表示ASCII字符,如:
  $result = "\377"; # this is the character 255,or EOF
  $result = "\xff"; # this is also 255
  .单引号字符串
  单引号字符串与双引号字符串有两个区别,一是没有变量替换功能,二是反斜线不支持转义字符,而只在包含单引号和反斜线时起作用。单引号另一个特性是可以跨多行,如:
  $text = 'This is two
  lines of text
  ';
  与下句等效:
  $text = "This is two\nlines of text\n";
  .字符串和数值的互相转换
  例1:
  $string = "43";
  $number = 28;
  $result = $string + $number; # $result = 71
  若字符串中含有非数字的字符,则从左起至第一个非数字的字符,如:
  $result = "hello" * 5; # $result = 0
  $result = "12a34" +1; # $result = 13
  .变量初始值
  在PERL中,所有的简单变量都有缺省初始值:"",即空字符。但是建议给所有变量赋初值,否则当程序变得大而复杂后,很容易出现不可预料且很难调试的错误。
  第二节:
  一、算术操作符 :+(加)、-(减)、*(乘)、/(除)、**(乘幂)、%(取余)、-(单目负)
  (1)乘幂的基数不能为负,如 (-5) ** 2.5 # error;
  (2)乘幂结果不能超出计算机表示的限制,如10 ** 999999 # error
  (3)取余的操作数如不是整数,四舍五入成整数后运算;运算符右侧不能为零
  (4)单目负可用于变量: - $y ; # 等效于 $y * -1
  二、整数比较操作符
  Table 3.1. 整数比较操作符
  操作符 描述
  < 小于
  > 大于
  == 等于
  = 大于等于
  != 不等于
   比较,返回 1, 0, or -1
  操作符结果为:
  0 - 两个值相等
  1 - 第一个值大
  1 - 第二个值大
  三、字符串比较操作符
  Table 3.2. 字符串比较操作符
  操作符 描述  
  lt 小于  
  gt 大于  
  eq 等于  
  le 小于等于  
  ge 大于等于  
  ne 不等于  
  cmp 比较,返回 1, 0, or -1  
  四、逻辑操作符
  逻辑或:$a || $b 或 $a or $b
  逻辑与:$a && $b 或 $a and $b
  逻辑非:! $a 或 not $a
  逻辑异或:$a xor $b
  五、位操作符
  位与:&
  位或:|
  位非:~
  位异或:^
  左移:$x > 2
  注:不要将&用于负整数,因为PERL将会把它们转化为无符号数。
  六、赋值操作符
  Table 3.3. 赋值操作符
  操作符 描述
  = Assignment only
  += Addition and assignment
  -= Subtraction and assignment
  *= Multiplication and assignment
  /= Division and assignment
  %= Remainder and assignment
  **= Exponentiation and assignment
  &= Bitwise AND and assignment
  |= Bitwise OR and assignment
  ^= Bitwise XOR and assignment
  Table 3.4. 赋值操作符例子
  表达式 等效表达式
  $a = 1; none (basic assignment)
  $a -= 1; $a = $a - 1;
  $a *= 2; $a = $a * 2;
  $a /= 2; $a = $a / 2;
  $a %= 2; $a = $a % 2;
  $a **= 2; $a = $a ** 2;
  $a &= 2; $a = $a & 2;
  $a |= 2; $a = $a | 2;
  $a ^= 2; $a = $a ^ 2;
  .=可在一个赋值语句中出现多次,如:
  $value1 = $value2 = &quot;a string&quot;;
  .=作为子表达式
  ($a = $b) += 3;
  等价于
  $a = $b;
  $a += 3;
  但建议不要使用这种方式。
  七、自增自减操作符 :++、--(与C++中的用法相同)
  .不要在变量两边都使用此种操作符:++$var-- # error
  .不要在变量自增/减后在同一表达式中再次使用:$var2 = $var1 + ++$var1; # error
  .在PERL中++可用于字符串,但当结尾字符为'z'、'Z'、'9'时进位,如:
  $stringvar = &quot;abc&quot;;
  $stringvar++; # $stringvar contains &quot;abd&quot; now
  $stringvar = &quot;aBC&quot;;
  $stringvar++; # $stringvar contains &quot;aBD&quot; now
  $stringvar = &quot;abz&quot;;
  $stringvar++; # $stringvar now contains &quot;aca&quot;
  $stringvar = &quot;AGZZZ&quot;;
  $stringvar++; # $stringvar now contains &quot;AHAAA&quot;
  $stringvar = &quot;ab4&quot;;
  $stringvar++; # $stringvar now contains &quot;ab5&quot;
  $stringvar = &quot;bc999&quot;;
  $stringvar++; # $stringvar now contains &quot;bd000&quot;
  .不要使用--,PERL将先将字符串转换为数字再进行自减
  $stringvar = &quot;abc&quot;;
  $stringvar--; # $stringvar = -1 now
  .如果字符串中含有非字母且非数字的字符,或数字位于字母中,则经过++运算前值转换为数字零,因此结果为1,如:
  $stringvar = &quot;ab*c&quot;;
  $stringvar++;
  $stringvar = &quot;ab5c&quot;;
  $stringvar++;
  八、字符串联结和重复操作符
  联接: .
  重复:x
  联接且赋值(类似+=): .=
  例:
  $newstring = &quot;potato&quot; . &quot;head&quot;;
  $newstring = &quot;t&quot; x 5;
  $a = &quot;be&quot;;
  $a .= &quot;witched&quot;; # $a is now &quot;bewitched&quot;
  九、逗号操作符
  其前面的表达式先进行运算,如:
  $var1 += 1, $var2 = $var1;
  等价于
  $var1 += 1;
  $var2 = $var1;
  使用此操作符的唯一理由是提高程序的可读性,将关系密切的两个表达式结合在一起,如:
  $val = 26;
  $result = (++$val, $val + 5); # $result = 32
  注意如果此处没有括号则意义不同:
  $val = 26;
  $result = ++$val, $val + 5; # $result = 27
  十、条件操作符
  与C中类似,条件?值1:值2,当条件为真时取值1,为假时取值2,如:
  $result = $var == 0 ? 14 : 7;
  $result = 43 + ($divisor == 0 ? 0 : $dividend / $divisor);
  PERL 5中,还可以在赋值式左边使用条件操作符来选择被赋值的变量,如:
  $condvar == 43 ? $var1 : $var2 = 14;
  $condvar == 43 ? $var1 = 14 : $var2 = 14;
  十一、操作符的次序
  Table 3.6. 操作符次序
  操作符 描述
  ++, -- 自增,自减
  -, ~, ! 单目
  ** 乘方
  =~, !~ 模式匹配
  *, /, %, x 乘,除,取余,重复
  +, -, . 加,减,联接
   移位
  -e, -r, etc. 文件状态
  =, lt, le, gt, ge 不等比较
  ==, !=, , eq, ne, cmp 相等比较
  & 位与
  |, ^ 位或,位异或
  && 逻辑与
  || 逻辑或
  .. 列表范围
  ? and : 条件操作符
  =, +=, -=, *=, 赋值
  and so on  
  , 逗号操作符
  not Low-precedence logical NOT
  and Low-precedence logical AND
  or, xor Low-precedence logical OR and XOR
  .操作符结合性(associativity):
  Table 3.7. 操作符结合性
  操作符 结合性
  ++, -- 无
  -, ~, ! Right-to-left
  ** Right-to-left
  =~, !~ Left-to-right
  *, /, %, x Left-to-right
  +, -, . Left-to-right
   Left-to-right
  -e, -r, 无
  =, lt, le, gt, ge Left-to-right
  ==, !=, , eq, ne, cmp Left-to-right
  & Left-to-right
  |, ^ Left-to-right
  && Left-to-right
  || Left-to-right
  .. Left-to-right
  ? and : Right-to-left
  =, +=, -=, *=, Right-to-left
  and so on  
  , Left-to-right
  not Left-to-right
  and Left-to-right
  or, xor Left-to-right
  建议:
  1、当你不确定某操作符是否先执行时,一定要用括号明确之。
  2、用多行、空格等方式提高程序的可读性。
  第三节:
  一、列表
  列表是包含在括号里的一序列的值,可以为任何数值,也可为空,如:(1, 5.3 , &quot;hello&quot; , 2),空列表:()。
  注:只含有一个数值的列表(如:(43.2) )与该数值本身(即:43.2 )是不同的,但它们可以互相转化或赋值。
  列表例:
  (17, $var, &quot;a string&quot;)
  (17, 26 {$i} is ';
  25
  26 printf &quot;$pointer->{$i}n&quot;;
  27 #
  28 # These next two lines should not show anything 29 #
  30 printf '${$pointer{$i}} is ';
  31 printf &quot;${$pointer{$i}} n&quot;;
  32 printf '${$pointer->{$i}} is ';
  33 printf &quot;${$pointer->{$i}}&quot;;
  34 printf &quot;n ================== end of test ================= n&quot;;
  35
  结果输出如下:
  ================== start test =================
  $$pointer{$i} is Fri
  ${$pointer}{$i} is Fri
  $pointer->{$i} is Fri
  ${$pointer{$i}} is
  ${$pointer->{$i}} is
  ================== end of test =================
  可以看到,前三种形式的输出显示了预期的结果,而后两种则没有。当你不清楚是否正确时,就输出结果看看。在Perl中,有不明确的代码就用print语句输出来实验一下,这能使你清楚Perl是怎样解释你的代码的。
  五、多维数组
  语句@array = list;可以创建数组的引用,中括号可以创建匿名数组的引用。下面语句为用于画图的三维数组的例子:
  $line = ['solid' , 'black' , ['1','2','3'] , ['4','5','6']];
  此语句建立了一个含四个元素的三维数组,变量$line指向该数组。前两个元素是标量,存贮线条的类型和颜色,后两个元素是匿名数组的引用,存贮线条的起点和终点。访问其元素语法如下:
  $arrayReference->[$index] single-dimensional array
  $arrayReference->[$index1][$index2] two-dimensional array
  $arrayReference->[$index1][$index2][$index3] three-dimensional array
  可以创建在你的智力、设计经验和计算机的内存允许的情况下极尽复杂的结构,但最好对可能读到或管理你的代码的人友好一些--尽量使代码简单些。另一方面,如果你想向别人炫耀你的编程能力,Perl给你足够的机会和能力编写连自己都难免糊涂的代码。:)
  建议:当你想使用多于三维的数组时,最好考虑使用其它数据结构来简化代码。
  下面为创建和使用二维数组的例子:
  1 #!/usr/bin/perl
  2 #
  3 # Using Multi-dimensional Array references
  4 #
  5 $line = ['solid', 'black', ['1','2','3'] , ['4', '5', '6']];
  6 print &quot;$line->[0] = $line->[0] n&quot;;
  7 print &quot;$line->[1] = $line->[1] n&quot;;
  8 print &quot;$line->[2][0] = $line->[2][0] n&quot;;
  9 print &quot;$line->[2][1] = $line->[2][1] n&quot;;
  10 print &quot;$line->[2][2] = $line->[2][2] n&quot;;
  11 print &quot;$line->[3][0] = $line->[3][0] n&quot;;
  12 print &quot;$line->[3][1] = $line->[3][1] n&quot;;
  13 print &quot;$line->[3][2] = $line->[3][2] n&quot;;
  14 print &quot;n&quot;; # The obligatory output beautifier.
  结果输出如下:
  $line->[0] = solid
  $line->[1] = black
  $line->[2][0] = 1
  $line->[2][1] = 2
  $line->[2][2] = 3
  $line->[3][0] = 4
  $line->[3][1] = 5
  $line->[3][2] = 6
  那么三维数组又如何呢?下面是上例略为改动的版本。
  1 #!/usr/bin/perl
  2 #
  3 # Using Multi-dimensional Array references again
  4 #
  5 $line = ['solid', 'black', ['1','2','3', ['4', '5', '6']]];
  6 print &quot;$line->[0] = $line->[0] n&quot;;
  7 print &quot;$line->[1] = $line->[1] n&quot;;
  8 print &quot;$line->[2][0] = $line->[2][0] n&quot;;
  9 print &quot;$line->[2][1] = $line->[2][1] n&quot;;
  10 print &quot;$line->[2][2] = $line->[2][2] n&quot;;
  11 print &quot;$line->[2][3][0] = $line->[2][3][0] n&quot;;
  12 print &quot;$line->[2][3][1] = $line->[2][3][1] n&quot;;
  13 print &quot;$line->[2][3][2] = $line->[2][3][2] n&quot;;
  14 print &quot;n&quot;;
  结果输出如下:
  $line->[0] = solid
  $line->[1] = black
  $line->[2][0] = 1
  $line->[2][1] = 2
  $line->[2][2] = 3
  $line->[2][3][0] = 4
  $line->[2][3][1] = 5
  $line->[2][3][2] = 6
  访问第三层元素的方式形如$line->[2][3][0],类似于C语言中的Array_pointer[2][3][0]。本例中,下标均为数字,当然亦可用变量代替。用这种方法可以把数组和哈希表结合起来构成复杂的结构,如下:
  1 #!/usr/bin/perl
  2 #
  3 # Using Multi-dimensional Array and Hash references
  4 #
  5 %cube = (
  6 '0', ['0', '0', '0'],
  7 '1', ['0', '0', '1'],
  8 '2', ['0', '1', '0'],
  9 '3', ['0', '1', '1'],
  10 '4', ['1', '0', '0'],
  11 '5', ['1', '0', '1'],
  12 '6', ['1', '1', '0'],
  13 '7', ['1', '1', '1']
  14 );
  15 $pointer = %cube;
  16 print &quot;n Da Cube n&quot;;
  17 foreach $i (sort keys %$pointer) {
  18 $list = $$pointer{$i};
  19 $x = $list->[0];
  20 $y = $list->[1];
  21 $z = $list->[2];
  22 printf &quot; Point $i = $x,$y,$z n&quot;;
  23 }
  结果输出如下:
  Da Cube
  Point 0 = 0,0,0
  Point 1 = 0,0,1
  Point 2 = 0,1,0
  Point 3 = 0,1,1
  Point 4 = 1,0,0
  Point 5 = 1,0,1
  Point 6 = 1,1,0
  Point 7 = 1,1,1
  这是一个定义立方体的例子。%cube中保存的是点号和坐标,坐标是个含三个数字的数组。变量$list获取坐标数组的引用:$list = $$ pointer{$i}; 然后访问各坐标值:$x = $list->[0]; ... 也可用如下方法给$x、$y和$z赋值:($x,$y,$z) = @$list;
  使用哈希表和数组时,用$和用->是类似的,对数组而言下面两个语句等效:
  $$names[0] = &quot;kamran&quot;;
  $names->[0] = &quot;kamran&quot;;
  对哈希表而言下面两个语句等效:
  $$lastnames{&quot;kamran&quot;} = &quot;Husain&quot;;
  $lastnames->{&quot;kamran&quot;} = &quot;Husain&quot;;
  Perl中的数组可以在运行中创建和扩展。当数组的引用第一次在等式左边出现时,该数组自动被创建,简单变量和多维数组也是一样。如下句,如果数组contours不存在,则被创建:
  $contours[$x][$y][$z] = &xlate($mouseX, $mouseY);
  六、子程序的引用
  perl中子程序的引用与C中函数的指针类似,构造方法如下:
  $pointer_to_sub = sub {... declaration of sub ...};
  通过所构造的引用调用子程序的方法为:
  &$pointer_to_sub(parameters);
  子程序模板
  子程序的返回值不仅限于数据,还可以返回子程序的引用。返回的子程序在调用处执行,但却是在最初被创建的调用处被设置,这是由Perl对Closure处理的方式决定的。Closure意即如果你定义了一个函数,它就以最初定义的内容运行。(Closure详见OOP的参考书)下面的例子中,设置了多个错误信息显示子程序,这样的子程序定义方法可用于创建模板。
  #!/usr/bin/perl
  sub errorMsg {
  my $lvl = shift;
  #
  # define the subroutine to run when called.
  #
  return sub {
  my $msg = shift; # Define the error type now.
  print &quot;Err Level $lvl:$msgn&quot;; }; # print later.
  }
  $severe = errorMsg(&quot;Severe&quot;);
  $fatal = errorMsg(&quot;Fatal&quot;);
  $annoy = errorMsg(&quot;Annoying&quot;);
  &$severe(&quot;Divide by zero&quot;);
  &$fatal(&quot;Did you forget to use a semi-colon?&quot;);
  &$annoy(&quot;Uninitialized variable in use&quot;);
  结果输出如下:
  Err Level Severe:Divide by zero
  Err Level Fatal:Did you forget to use a semi-colon?
  Err Level Annoying:Uninitialized variable in use
  上例中,子程序errorMsg使用了局域变量$lvl,用于返回给调用者。当errorMsg被调用时,$lvl的值设置到返回的子程序内容中,虽然是用的my函数。三次调用设置了三个不同的$lvl变量值。当errorMsg返回时,$lvl的值保存到每次被声明时所产生的子程序代码中。最后三句对产生的子程序引用进行调用时$msg的值被替换,但$lvl的值仍是相应子程序代码创建时的值。
  很混淆是吗?是的,所以这样的代码在Perl程序中很少见。
  七、数组与子程序
  数组利于管理相关数据,本节讨论如何向子程序传递多个数组。前面我们讲过用@_传递子程序的参数,但是@_是一个单维数组,不管你传递的参数是多少个数组,都按序存贮在@_中,故用形如my(@a,@b)=@_; 的语句来获取参数值时,全部值都赋给了@a,而@b为空。那么怎么把一个以上的数组传递给子程序呢?方法是用引用。见下例:
  #!/usr/bin/perl
  @names = (mickey, goofy, daffy );
  @phones = (5551234, 5554321, 666 );
  $i = 0;
  sub listem {
  my ($a,$b) = @_;
  foreach (@$a) {
  print &quot;a[$i] = &quot; . @$a[$i] . &quot; &quot; . &quot;tb[$i] = &quot; . @$b[$i] .&quot;n&quot;;
  $i++;
  }
  }
  &listem(@names, @phones);
  结果输出如下:
  a[0] = mickey b[0] = 5551234
  a[1] = goofy b[1] = 5554321
  a[2] = daffy b[2] = 666
  注意:
  1、当想传递给子程序的参数是多于一个的数组时一定要使用引用。
  2、一定不要在子程序中使用形如 (@variable)=@_; 的语句处理参数,除非你想把所有参数集中到一个长的数组中。
  八、文件句柄的引用
  有时,必须将同一信息输出到不同的文件,例如,某程序可能在一个实例中输出到屏幕,另一个输出到打印机,再一个输出到记录文件,甚至同时输出到这三个文件。相比较于每种处理写一个单独的语句,可以有更好的实现方式如下:
  spitOut(*STDIN);
  spitOut(*LPHANDLE);
  spitOut(*LOGHANDLE);
  其中子程序spitOut的代码如下:
  sub spitOut {
  my $fh = shift;
  print $fh &quot;Gee Wilbur, I like this lettucen&quot;;
  }
  注意其中文件句柄引用的语法为*FILEHANDLE。
  Perl中的模块
  注: 如果你的e文好, 那就看一看PERL的MAN手册吧 那里面什么都有PERL 中的模块 结构很简单 用起来也不难 但至少我不是很喜欢它
  注意 PERL中的模块和类是同意词
  perlobj.1 中对模块有三条简单的定义
  1 一个模块是一个引用 但系统知道它属于那一个类
  2 一个类是一个包 它提供了一些方法
  3 一个方法是一个SUB 它的第一个参数为一个类的引用
  在PERL中并没有明确的定义类的构造函数
  我们所使用的类的引用一般是一个HASH的引用 通过调用函数bless
  将它同一个类绑在一起
  例如:
  Critter.pm
  package Critter
  sub new {
  bless {};
  }
  本例中返回了一个空的HASH表(PERL中也叫做匿名表)
  复杂一点的例子
  try.pm
  package try;
  sub new {
  $para = @_;
  %hash = {};
  $hash{'a'} = $para{'a'};
  bless %hash, try;
  return %hash;
  }
  sub pp {
  print shift;
  print (&quot;\n&quot;, @_);
  }
  a.pl // 它与try.pm放在同一个目录下
  use try;
  $m_try = try::new(a => &quot;hello&quot;);
  $m_try->pp(&quot;hello world&quot;);
  一般的文章上都说 应该这样用:
  sub new {
  my $this = shift;
  my $class = ref($this) || $this;
  my $self = {};
  bless $self, $class
  $self->initialize();
  return $self;
  }
  而上面的例子却不是这样 Why?
  这个问题涉及到如何new一个类.
  1 try::new(a => &quot;hello&quot;);
  2 try->new(a => &quot;hello&quot;);
  3 new try(a => &quot;hello&quot;);
  第二个和第三个是一样的
  2,3 中函数new的参数是 ('try', 'a', 'hello')
  1 的参数却是('a', 'hello');
  #对于2 3 你可以理解为将class->new(arg); 转换为 new::(class,arg)
  #这与class是什么东西无关 如同 $m_class->method(arg)被转换为
  #class::method($m_class,arg)一样
  PERL的类常用 2 3 两种方法创建
  当调用一个类中的方法时 第一个参数为HASH表的引用
  try.pm
  sub pp {
  $class = shift;
  print (@_, $class->{'a'});
  }
  $m_try = new try('a' => 'hello');
  $m_try->pp(&quot;ha ha ha&quot;);
  下面看一看 PERL中类的继承
  PERL的类继承很奇怪 子类的目录比父类低一层
  如
  Tk.pm
  Tk/Button.pm
  Button.pm
  package Tk::Button.pm
  ...
  ...
  另一种方法是使用@ISA
  class UNIVERSAL
  这是一个特殊的类 所有的类都是它的子类 它定义了如下的方法
  isa 判断是不是某个类的引用
  can 是否存在某个方法
  VERSION 判断版本号
  SUPER:: 用于调用父类中的方法
  如:
  $self->SUPER::get();
  先看一看如何使用@ISA 完成类的继承
  #try.pm 父类
  package try;
  $VERSION = &quot;1.00&quot;;
  sub new {
  bless {} ,try;
  }
  sub pp {

  print &quot;this is in father>  }
  #tt.pm 子类
  package tt;
  use trk;
  @ISA = qw(try); #这样在tt中找不到的方法 会在try中查找
  #如同tt是try的子类
  sub new {
  bless {} ,tt;
  }
  sub pp {

  print &quot;this is in son>  }
  #c.pl
  #!/usr/bin/perl
  use tt;
  $m_tt = new tt;
  $m_tt->pp;

  这中方法会显示 &quot;this is in son>  注: 你应该定义new在类tt.pm中, 不然会显示

  &quot;this is in father>  原因是调用了try中的new, 引用被bless成了try的.
  修改tt.pm
  sub pp {
  $self = shift;
  $self->SUPER::pp; #调用父类中的方法
  }
  会显示&quot;this is in father&quot;
  9: Perl 中的正则表达式
  正则表达式的三种形式
  正则表达式中的常用模式
  正则表达式的 8 大原则
  正则表达式是 Perl 语言的一大特色,也是 Perl 程序中的一点难点,不过如果大家能够很好的掌握他,就可以轻易地用正则表达式来完成字符串处理的任务,当然在 CGI 程序设计中就更能得心应手了。下面我们列出一些正则表达式书写时的一些基本语法规则。
  --------------------------------------------------------------------------------
  9.1 正则表达式的三种形式
  首先我们应该知道 Perl 程序中,正则表达式有三种存在形式,他们分别是:
  匹配:m// (还可以简写为 // ,略去 m)
  替换:s///
  转化:tr///
  这三种形式一般都和 =~ 或 !~ 搭配使用(其中 &quot;=~&quot; 表示相匹配,在整条语句中读作 does,&quot;!~&quot; 表示不匹配,在整条语句中读作 doesn't),并在左侧有待处理的标量变量。如果没有该变量和 =~ !~ 操作符,则默认为处理 $_ 变量中的内容。举例如下:
  $str = &quot;I love Perl&quot;;
  $str =~ m/Perl/; # 表示如果在 $str 中发现 &quot;Perl&quot; 字符串,则返回 &quot;1&quot; 否则返回 &quot;0&quot;。
  $str =~ s/Perl/BASH/; # 表示将变量 $str 中的 &quot;Perl&quot; 字符串替换为 &quot;BASH&quot;,如果发生此替换则返回 &quot;1&quot;,否则返回 &quot;0&quot;。
  $str !~ tr/A-Z/a-z/; # 表示将变量 $str 中的所有大写字母转化为小写字母,如果转化发生了则返回 &quot;0&quot;,否则返回 &quot;1&quot;。
  另外还有:
  foreach (@array) { s/a/b/; } # 此处每次循环将从 @array 数组中取出一个元素存放在 $_ 变量中,并对 $_ 进行替换处理。
  while () { print if (m/error/); } # 这一句稍微复杂一些,他将打印 FILE 文件中所有包含 error 字符串的行。
  Perl 的正则表达式中如果出现 () ,则发生匹配或替换后 () 内的模式被 Perl 解释器自动依次赋给系统 $1, $2 ...... 请看下面的例子:
  $string = &quot;I love perl&quot;;
  $string =~ s/(love)//; # 此时 $1 = &quot;love&quot;,并且该替换的结果是将 $string 变为 &quot;I  perl&quot;
  $string = &quot;i love perl&quot;;
  $string =~ s/(i)(.*)(perl)/$2/; # 这里 $1 = &quot;i&quot;,$2 = &quot; love &quot;,$3 = &quot;perl&quot;,并且替换后 $string 变为 &quot; love &quot;
  替换操作 s/// 还可以在末尾加上 e 或 g 参数,他们的含义分别为:
  s///g 表示把待处理字符串中所有符合  的模式全部替换为  字符串,而不是只替换第一个出现的模式。
  s///e 表示将把  部分当作一个运算符,这个参数用的不多。
  比如下面的例子:
  $string = &quot;i:love:perl&quot;;
  $string =~ s/:/*/; #此时 $string=&quot;i*love:perl&quot;;
  $string = &quot;i:love:perl&quot;;
  $string =~ s/:/*/g; #此时 $string=&quot;i*love*perl&quot;;
  $string =~ tr/*/ /; #此时 $string=&quot;i love perl&quot;;
  $string = &quot;www22cgi44&quot;;
  $string =~ s/(\d+)/$1*2/e; # (/d+)代表 $string 中的一个或多个数字字符,将这些数字字符执行 *2 的操作,因此最后 $string 变成了 &quot;www44cgi88&quot;。
  下面给出一个完整的例子:
  #!/usr/bin/perl
  print&quot;请输入一个字符串!\n&quot;;
  $string = ; # 代表标准输入,会让使用者输入一字符串
  chop($string); # 将$string最后一个换行的字符\n删除掉
  if($string =~ /perl/){
  print(&quot;输入的字符串中有 perl 这个字符串!\n&quot;;
  }
  如果输入的字符串含有 perl 这个字符串的话,就会显示后面的提示信息。
  9.2 正则表达式中的常用模式
  下面是正则表达式中的一些常用模式。
  /pattern/ 结果
  . 匹配除换行符以外的所有字符
  x? 匹配 0 次或一次 x 字符串
  x* 匹配 0 次或多次 x 字符串,但匹配可能的最少次数
  x+ 匹配 1 次或多次 x 字符串,但匹配可能的最少次数
  .* 匹配 0 次或一次的任何字符
  .+ 匹配 1 次或多次的任何字符
  {m} 匹配刚好是 m 个 的指定字符串
  {m,n} 匹配在 m个 以上 n个 以下 的指定字符串
  {m,} 匹配 m个 以上 的指定字符串
  [] 匹配符合 [] 内的字符
  [^] 匹配不符合 [] 内的字符
  [0-9] 匹配所有数字字符
  [a-z] 匹配所有小写字母字符
  [^0-9] 匹配所有非数字字符
  [^a-z] 匹配所有非小写字母字符
  ^ 匹配字符开头的字符
  $ 匹配字符结尾的字符
  \d 匹配一个数字的字符,和 [0-9] 语法一样
  \d+ 匹配多个数字字符串,和 [0-9]+ 语法一样
  \D 非数字,其他同 \d
  \D+ 非数字,其他同 \d+
  \w 英文字母或数字的字符串,和 [a-zA-Z_0-9] 语法一样
  \w+ 和 [a-zA-Z0-9]+ 语法一样
  \W 非英文字母或数字的字符串,和 [^a-zA-Z_0-9] 语法一样
  \W+ 和 [^a-zA-Z_0-9]+ 语法一样
  \s 空格,和 [\n\t\r\f] 语法一样
  \s+ 和 [\n\t\r\f]+ 一样
  \S 非空格,和 [^\n\t\r\f] 语法一样
  \S+ 和 [^\n\t\r\f]+ 语法一样
  \b 匹配以英文字母,数字为边界的字符串
  \B 匹配不以英文字母,数值为边界的字符串
  a|b|c 匹配符合a字符 或是b字符 或是c字符 的字符串
  abc 匹配含有 abc 的字符串
  (pattern) () 这个符号会记住所找寻到的字符串,是一个很实用的语法。第一个 () 内所找到的字符串变成 $1 这个变量或是 \1 变量,第二个 () 内所找到的字符串变成 $2 这个变量或是 \2 变量,以此类推下去。
  /pattern/i i 这个参数表示忽略英文大小写,也就是在匹配字符串的时候,不考虑英文的大小写问题。
  \ 如果要在 pattern 模式中找寻一个特殊字符,如 &quot;*&quot;,则要在这个字符前加上 \ 符号,这样才会让特殊字符失效
  下面给出一些例子:
  范例 说明
  /perl/ 找到含有 perl 的字符串
  /^perl/ 找到开头是 perl 的字符串
  /perl$/ 找到结尾是 perl 的字符串
  /c|g|i/ 找到含有 c 或 g 或 i 的字符串
  /cg{2,4}i/ 找到 c 后面跟着 2个到 4个 g ,再跟着 i 的字符串
  /cg{2,}i/ 找到 c 后面跟着 2个以上 g ,再跟着 i 的字符串
  /cg{2}i/ 找到 c 后面跟着 2个 g,再跟着 i 的字符串
  /cg*i/ 找到 c 后面跟着 0个或多个 g ,再跟着 i 的字符串,如同/cg{0,}i/
  /cg+i/ 找到 c 后面跟着一个以上 g,再跟着 i 的字符串,如同/cg{1,}i/
  /cg?i/ 找到 c 后面跟着 0个或是 1个 g ,再跟着 i 的字符串,如同/cg{0,1}i/
  /c.i/ 找到 c 后面跟着一个任意字符,再跟着 i 的字符串
  /c..i/ 找到 c 后面跟着二个任意字符,再跟着 i 的字符串
  /[cgi]/ 找到符合有这三个字符任意一个的字符串
  /[^cgi]/ 找到没有这三个字符中任意一个的字符串
  /\d/ 找寻符合数字的字符,可以使用/\d+/来表示一个或是多个数字组成的字符串
  /\D/ 找寻符合不是数字的字符,可以使用/\D+/来表示一个或是更多个非数字组成的字符串
  /\*/ 找寻符合 * 这个字符,因为 * 在常规表达式中有它的特殊意思,所以要在这个特殊符号前加上 \ 符号,这样才会让这个特殊字符失效
  /abc/i 找寻符合 abc 的字符串而且不考虑这些字符串的大小写
  9.3 正则表达式的八大原则
  如果在 Unix 中曾经使用过 sed、awk、grep 这些命令的话,相信对于 Perl 语言中的正则表达式(Regular Expression)不会感到陌生。Perl 语言由于有这个功能,所以对字符串的处理能力非常强。在Perl语言的程序中,经常可以看到正则表达式的运用,在 CGI 程序设计中也不例外。
  正则表达式是初学 Perl 的难点所在,不过只要一旦掌握其语法,你就可以拥有几乎无限的模式匹配能力,而且 Perl 编程的大部分工作都是掌握常规表达式。下面给大家介绍几条正则表达式使用过程中的 8 大原则。
  正则表达式在对付数据的战斗中可形成庞大的联盟——这常常是一场战争。我们要记住下面八条原则:
  · 原则1:正则表达式有三种不同形式(匹配(m/ /),替换(s/ / /eg)和转换(tr/ / /))。
  · 原则2:正则表达式仅对标量进行匹配( $scalar =~ m/a/; 可以工作; @array =~ m/a/ 将把@array作为标量对待,因此可能不会成功)。
  · 原则3:正则表达式匹配一个给定模式的最早的可能匹配。缺省时,仅匹配或替换正则表达式一次( $a = 'string string2'; $a =~ s/string/ /; 导致 $a = 'string 2')。
  · 原则4:正则表达式能够处理双引号所能处理的任意和全部字符( $a =~ m/$varb/ 在匹配前把varb扩展为变量;如果 $varb = 'a' $a = 'as',$a =~ s/$varb/ /; 等价于 $a =~ s/a/ /; ,执行结果使 $a = &quot; s&quot; )。
  · 原则5:正则表达式在求值过程中产生两种情况:结果状态和反向引用: $a=~ m/pattern/ 表示 $a 中是否有子串 pattern 出现,$a =~ s/(word1)(word2)/$2$1/ 则“调换”这两个单词。
  · 原则6:正则表达式的核心能力在于通配符和多重匹配运算符以及它们如何操作。$a =~ m/\w+/ 匹配一个或多个单词字符;$a =~ m/\d/&quot; 匹配零个或多个数字。
  · 原则7:如果欲匹配不止一个字符集合,Perl使用 &quot;|&quot; 来增加灵活性。如果输入 m/(cat|dog)/ 则相当于“匹配字符串 cat 或者 dog。
  · 原则8:Perl用 (?..) 语法给正则表达式提供扩展功能。(这一点请同学们课后看相关资料)
  想要学习所有这些原则?我建议大家先从简单的开始,并且不断的尝试和实验。实际上如果学会了 $a =~ m/ERROR/ 是在 $a 中查找子串ERROR,那么你就已经比在 C 这样的低层语言中得到了更大的处理能力。
  Perl 数据结构
  变量名字
  Perl 有三种数据结构: 数值, 数值的数组, 还有数值的关联数组, 即``哈希表''. 普通的数组以数字为索引, 从 0 开始(负值的下标从数组尾部开始计算). 哈希表中的元素是以字符串索引.
  数值变量以 '$' 打头, 当引用数组中的一个元素时也一样. 意思是&quot;这&quot;. 举例:
  $days # 数值变量 &amp;quot;days&amp;quot; $days[28] # 数组 @days 的第29个元素 $days{'Feb'} # 哈希表 %days 中 'Feb' 代表的数值 $#days # 数组 @days 的最大下标
  当表示整个数组或数组的一部分时, 用 '@' 打头, 意思是 &quot;这些&quot; 或 &quot;那些&quot;
  @days # ($days[0], $days[1],... $days[n]) @days[3,4,5] # 即 @days[3..5] @days{'a','c'} # 即 ($days{'a'},$days{'c'})
  当表示整个哈希表时用 '%' 打头:
  %days # (key1, val1, key2, val2 ...)
  此外, 子过程用 '&' 打头, 当不致引起混淆的时候可以省略. 符号表表项用 '*' 打头, 手册后面部分有详细说明.
  不同的变量类型有自己的名字空间. 为一个数值变量, 一个数组和一个哈希表(一个文件句柄, 一个子过程, 一个标号)取相同的名字并不会引起冲突. 也就是说, $foo 和 @foo 是两个不同的变量. $foo[1] 是 @foo 的一部分, 而不是 $foo 的一部分. 看起来也许有点怪, 但要习惯它.
  既然变量和数组名都是以 '$', '@', 或 '%' 打头, 那些 ``保留字'' 实际上并非对变量而言. (它们实际上是对标号和文件句柄而言, 标号和文件句柄是没有特殊的打头字母. 给一个文件句柄取名 ``log'' 是错误的. 应该用 open(LOG,'logfile') 而非 open(log,'logfile') . 用大写字母来表示文件句柄也增加了可读性, 避免和将来出现的保留字冲突.) 大小写是区分的 -- ``FOO'', ``Foo'' 和 ``foo'' 是完全不同的名字. 以字母或下划线开头的名字可以包含数字和下划线.
  一个以字母数字组成的名字代表的变量可以用一个返回同类型的引用的表达式代替, 详见 perlref .
  数字开头的名字只能包含更多的数字. 不是以字母, 数字, 下划线开头的名字只能有一个字符. 例如: $% 或 $$ . (大部分这些单字符名字是 Perl 的预定义变量, 例如, $$ 是当前进程号.)
  变量名字
  Perl 对操作和变量值的解释有时依赖于上下文. 主要的上下文有两种: 数值和列表. 某些操作, 如果上下文期待的是列表, 就返回列表结果, 对期待数值的上下文就返回数值(如果某种操作有这种上下文依赖性, 会在有关文档中说明). 换句话说, Perl 会根据期待的结果是单个或多个重载一些操作.
  与此相对的, 一个操作会为它的每一个参数确定上下文. 例如
  int( &lt;stdin&gt;)
  取整数操作为  提供了一个数值上下文,  在 STDIN 读入一行并传送给取整数操作, 后者求出这一行代表的整数值并返回. 而下面的例子
  sort( &lt;stdin&gt;)
  排序操作为  提供了一个列表上下文, 从 STDIN 中读入所有的行直到文件结束, 这些行组成的列表被传送到排序操作, 后者对它们排序并返回排序后的行列表.
  赋值操作是用等号左边的参数来确定右边参数的上下文. 为数值变量赋值的操作给右边参数确定了数值上下文, 给数组或数组的一部分赋值的时候右边参数是处于列表上下文.
  自定义的子过程可以自行确定被调用时的上下文, 但很多场合下不需要这么做, 因为数值可以自动转化成列表. 参看 wantarray .
  数值变量
  Perl 里的数据要么是数值型, 要么是数值型的数组, 要么是数值型的哈希表. 数值变量可以存放不同类型的单个数据, 比如数字, 字符串, 和引用. 一般情况下, 不同类型之间的转换是透明的. (一个数值型不能存放多个值, 但可以存放对数组或哈希表的引用.) 由于自动类型转换, 返回数值型的操作和函数不需要担心(实际上是不能担心)上下文是等待一个数字还是一个字符串.
  数值型不必确定自己的类型. 其实也没有地方去把一个数值型变量声明为``string'', 或 ``number'', 或``filehandle'', 或是其它什么类型. 在 Perl 中, 数值型变量的类型可以是数字或字符串或引用, 根据上下文确定. 字符串和数字实际上没什么两样, 但引用是不可转换的指针, 有内建的引用计数和析构过程.
  非空的字符串或非 0 (字符串``0'')的数字可以表示布尔类型中的真值. 布尔上下文是一种特殊的数值型上下文.
  空数值型实际上有两种情况: 已定义和未定义的. 当没有任何实际的值存在时, 未定义的空数值型被返回, 比如发生错误的时候, 或者读到文件结束的地方, 或者引用了一个未初始化的变量. 当一个未定义的空数值型首次被使用时, 就变成已定义的, 在此之前可以用 defined() 去检查一个值是否被定义了.
  要知道一个字符串是否一个有效的非 0 数字, 一般是确定它不是数值 0 或 字符串 ``0''
  if ($str == 0 &amp;amp;&amp;amp; $str ne &amp;quot;0&amp;quot;) { warn &amp;quot;That doesn't look like a number&amp;quot;; }
  别的方法是用正则表达式进行检查, 参看 perlre 中对正则表达式的详细介绍.
  warn &amp;quot;has nondigits&amp;quot; if /\D/; warn &amp;quot;not a whole number&amp;quot; unless /^\d+$/; warn &amp;quot;not an integer&amp;quot; unless /^[+-]?\d+$/ warn &amp;quot;not a decimal number&amp;quot; unless /^[+-]?\d+\.?\d*$/ warn &amp;quot;not a C float&amp;quot; unless /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/;
  数组的长度是一个数值型. 数组 @days 的长度是 $# days, 的值, 和 csh 里一样. (实际上这不是数组的长度, 是最大的下标, 因为有数组里第 0 个元素.) 给 $# days 赋值可以改变数组的长度. 用同样的方法缩短数组的长度会破坏被截去的数值. 重新增加被缩短的数组不再能恢复这些数值(在 Perl 4 里是可以的, 但为了保证正确的调用析构做了这样的改变). 给超出最大下标的数组元素赋值可以扩展数组的长度, 给数组赋上空的列表 () 就把数组的长度减为 0 .
  @whatever = (); $#whatever = $[ - 1;
  如果在数值型上下文里计算数组的值, 会得到数组的长度. (并不适用于列表, 会返回最后一个值, 象 C 的逗号操作符) 以下的等式是成立的:
  scalar(@whatever) == $#whatever - $[ + 1;
  Perl 第 5 版改变了 $[ 的语意: 不设置 $[ 的文件不用担心别的文件会否改变自己的 $[ 的值. (换句话说, 不赞成使用 $[) 所以一般可以认为
  scalar(@whatever) == $#whatever + 1;
  有些程序员选择显式的转换:
  $element_count = scalar(@whatever);
  如果在数值型上下文里计算哈希表的值, 如果哈希表里有key/value对, 会得到一字符串, 其中包含了该哈希表占据的空间和已经分配的空间, 用 '/' 分开. 这可以检查一下 Perl 的散列算法是否有效. 比如, 在哈希表里存放了 10,000 个元素, 而在数值型上下文里计算 %HASH 得到 ``1/16'', 那情况就太浪费空间了.
  数值型的值的表示
  数字用习惯的浮点数或整数表示法:
  12345 12345.67 .23E-10 0xffff # 16 进制 0377 # 8 进制 4_294_967_296 # 用下划线容易阅读
  字符串一般用单引号或双引号括住. 引号的作用和 shell 里类似: 双引号字符串中可以有反斜杠和变量替换; 单引号字符串不行(除了 ``\''' 和 ``\\''). 一般的 Unix 反斜杠替换规则同样用来表示换行符, 制表符...等等. 见列表qq.
  换行符可以直接嵌入在字符串中. 但如果忘记了结尾的引号, 直到 Perl 找到另外一行有引号的行前不会报出任何错误. 字符串中的变量替换限制于数值型, 数组和数组的部分. (即以$ 或 @ 打头的标识符, 后跟一个可选的括起来的下标) 下面的代码打印出 &quot;The price is $100.&quot;
  $Price = '$100'; # not interpreted print &amp;quot;The price is $Price.\n&amp;quot;; # interpreted
  和在某些 shell 下一样, 可以用花括号把标识符括住, 以区别于其他后随的字母. 实际上, 花括号中的标识符一定是个字符串, 就象一个哈希表的下标. 早先的例子
  $days{'Feb'}
  可以写成
  $days{Feb}
  引号是会被自动加上, 而下标中复杂的部分会被解释为表达式.
  要注意, 单引号字符串要和前面的词用空白隔开, 因为单引号本身是可以组成标识符. (参看Packages).
  有两个特别的字符串是 __LINE__ 和 __FILE__, 分别代表程序执行点的当前行号和文件名. 它们只能用做分隔记号; 不能被转换成字符串. 此外, __END__ 可以用于在脚本的真正结束位置前标记逻辑结束位置, 在此后的所有文字都被忽略, 但可以通过 DATA 文件句柄读出. (DATA 文件句柄只能从主脚本读取, 不能从required包含的文件或计算的字符串读取) 控制字符 ^D 和 ^Z 是 __END__ 的同义字. (在模块里是 __DATA__ 的同义字; 关于 __DATA__ 的详细说明, 参看SelfLoader)
  在语法上没有其他解释的词都被看作一个引起来的字符串. 称为``净词''. 和文件句柄和标号一样, 全是小写字母的净词可能会和将来的保留字冲突, 如果使用 -w 选项, Perl 会对这些词发出警告. 有些人会完全不使用净词. 如果用
  use strict 'subs';
  那么所有不能被解释为子过程调用的净词都会产生一条编译时刻错误. 严格检查一直到闭合块的结尾为止. 内部块用以下方法可以撤消严格检查 no strict 'subs' .
  如果把数组的所有元素连接到一起形成一个双引号字符串, 以变量 $&quot; ( $LIST_SEPARATOR )指定的字符做为分隔符(默认为空格).
  $temp = join($&amp;quot;,@ARGV); system &amp;quot;echo $temp&amp;quot;; system &amp;quot;echo @ARGV&amp;quot;;
  在搜索模式(也要做替换)中模糊是很糟糕的: 到底 /$foo[bar]/ 是解释为 /${foo}[bar]/ ([bar]/ 是正则表达式字符类) 还是解释成 /${foo[bar]}/ ([bar]/ 是数组下标)? 如果 @foo 不存在, 那么明显是个字符类. 如果 @foo 存在, Perl 要猜测 [bar] 是什么, 一般结果是正确的. 但如果猜错了, 或者你可以用花括号来指示正确的解释方法.
  面向行的引用是建立在 shell 的 ``here-doc'' 语法上. 在

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-560938-1-1.html 上篇帖子: Installing Perl RRD module – RRDs.pm-coding 下篇帖子: ASP、JSP、PHP 、Perl、.NET 等WEB开发语言比较
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表