从现在开始,每天一点点……

发布新日志

  • 获取Weblist数据并输出到Excel

    2012-05-31 14:54:53

    1.打开URL:http://newtours.demoaut.com/mercuryreservation.php
    2.下面代码是获取Weblist对象中的数据并输出到Excel

    ListSize = Browser("Welcome: Mercury Tours").Page("Find a Flight: Mercury").WebList("fromPort").GetTOProperty("Items count")
    Dim FromArray()
    ReDim FromArray(ListSize - 1)

    'msgbox ListSize
    For i = 1 To ListSize
        FromArray(i - 1) = Browser("Welcome: Mercury Tours").Page("Find a Flight: Mercury").WebList("fromPort").GetItem(i)
        WriteFile(FromArray(i - 1))
    Next

    Function WriteFile( ByVal Var)
        Const ForReading = 1, ForWriting = 2, ForAppending = 8
        Dim fso,f
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set f = fso.OpenTextFile("d:\QTP\test.xls", ForAppending, True)
        f.WriteLine Var
        f.Close
    End Function
  • Ordinal Identifier(关于index,Location,CreationTime应用)

    2012-03-07 16:39:26

    除了学习在Object Identification对话框中((Tools > Object Identification))规定的强制性和辅助属性,QuickTest还可以了解每一个测试对象的备份顺序标识,分配给对象的数字ordinal identifier与其他对象的an otherwise identical description有关(在mandatory and assistive property 的列表中指定的对象的所有属性值都一样)。定制的值使QuickTest创建一个唯一的描述当mandatory and assistive 属性不能满足时.

    QTP只有在得到描述和Smart Identification机制 不能足够唯一识别一个对象的时候,才会使用an ordinal identifier机制。如果QTP在运行一个会话时能使用其他测试对象属性去识别对象的,an ordinal identifier 将会被忽略

    Index.表示对象出现在应用程序代码中相对于其他对象具有的不一样的描述顺序

    Location.表示对象出现在父WindowFrameDialog的顺序不同于其他对象的唯一描述

    CreationTime.(仅适用于浏览器)被打开浏览器顺序相对于其他打开的浏览器具有唯一的描述

     

    使用Index属性识别对象

    QTP得到一个对象时,会分配一个值给测试对象的index属性使其能唯一的识别这个对象。这个值是基于对象在源代码中出现的顺序分配的。第一次出现的值为0

    Index property values are object-specific。因此,当你使用index:=3去描述WebEdit 测试对象时,QTP就会在页面中搜索第四个WebEdit对象。而如果使用index:=3描述一个WebElement对象时,QTP就会搜在页面中搜索第四个web对象,与对象的类型无关,因为WebElement对象适用所有web对象。

    ·         an image with the name Apple

    ·         an image with the name UserName

    ·         a WebEdit object with the name UserName

    ·         an image with the name Password

    ·         a WebEdit object with the name Password

    下面中的陈述指列表中的第三项,因为这是页面上第一个名称为UserNameWebEdit对象

    WebEdit(“Name:=UserName”, “Index:=0”)

    相反,下面的陈述指的是列表中的第二项,因为那是指所有(WebElement)对象中名称为UserName的第一个对象。

    WebElement(“Name:=UserName”, “Index:=0”)

     

     

    使用Location属性识别对象

    但得到一个对象的时候,QTP会给测试对象的Location属性分配一个值以唯一的识别这个对象,这个值基于相对于具有相同属性的其他对象在WindowFrameDialog box中出现的顺序给出的,

    第一次出现的值为0。这些值是按照从上到下,从左到右的顺序分配的。例如:

    Location属性值是指定对象的。因此,如果使用Location:=3描述一个WinButton测试对象,QTP会在页面上按照从上到下,从左到右的顺序搜索第四个WinButton对象。然而,如果使用Location:=3描述一个WinObject对象,QTP会按照从上到下,从左到右的顺序搜索页面上第四个标准对象,与类型无关,因为WinObject适用于所有标准对象。

    例如:一个对话框包含下面的对象

    ·         a button object with the name OK

    ·         a button object with the name Add/Remove

    ·         a check box object with the name Add/Remove

    ·         a button object with the name Help

    ·         a check box object with the name Check spelling

    下面的陈述指的是列表中的第三项,因为它是页面上第一个名为Add/RemoveCheck box对象

    WinCheckBox(“Name:=Add/Remove”, ”Location:=0”)

    相反,下面的陈述值得是列表中的第二项,因为他是第一个名为Add/Remove的对象

    WinObject("Name:=Add/Remove", "Location:=0")

    使用CreationTime属性识别对象

    当得到一个浏览器对象的时候,如果QTP不能根据它的对象描述唯一的识别这个对象时,他会给测试对象属性CreationTime分配一个值。这个值表示被打开的浏览器相对于已经打开浏览器顺序的唯一不同的描述。第一个打开的浏览器接收到CreationTime=0.

    在运行一个会话期间,如果QTP不能根据测试对象仅有的描述去识别一个浏览器对象,它会检查浏览器被打开的顺序,并且使用CreationTime属性去识别正却的浏览器

    例如:你录制了一个模块分别在9:01 pm, 9:03 pm, and 9:05 pm打开的浏览器上,QTP会这样分配CreationTime的值:9:01 pm 打开的浏览器为CreationTime:=0, 9. 03 pm 打开的浏览器为CreationTime:=1, 9.05 pm 打开的浏览器为CreationTime:=2

    10:30pm要运行那个模块,假设浏览器被打开分别在10:31 pm, 10:33 pm, and 10:34 pm.QTP会这样识别浏览器:用具有CreationTime:=0测试对象识别在10:31 pm被打开的浏览器,用具有CreationTime:=1测试对象识别在10:33 pm被打开的浏览器,用具有CreationTime:=2测试对象识别在10:34 pm被打开的浏览器

    如果打开了几个浏览器,拥有最小CreationTime值的浏览器是第一个被打开的,拥有最大CreationTime值的浏览器是最后一个被打开的。如果有三个或者更多的浏览器被打开,拥有CreationTime:=2的是第三个被打开的浏览器。如果在运行一个session的时候打开了七个浏览器,

    拥有CreationTime:=6属性的浏览器是最后打开的

    如果在有指定CreationTime值的浏览器中录制一个step,但是在运行session的时候没有具有CreationTime值的浏览器打开,the step将会在具有最大CreationTime值的浏览器上运行。

    下面这个例子:

    SystemUtil.Run "iexplore.exe", "http://www.baidu.com"               'CreationTime 0

    SystemUtil.Run "iexplore.exe", "http://www.google.com.hk/webhp?hl=zh-CN&sourceid=cnhp"      'CreationTime 1

    SystemUtil.Run "iexplore.exe", "http://www.taobao.com"

     

    wait(30)

    Browser( "creationtime:=" ).Highlight

    wait(30)

    Browser( "creationtime:=1" ).Highlight

    wait(30)

    Browser( "creationtime:=2" ).Highlight

    我不知道为什么设置第一个creationtime:=0时,Hight顺序就不正确了
  • QTP使用Excel参数化

    2012-03-07 14:58:48

    1.创建一个文件在D:\TestFile.xls


    2.编写下面的代码
    Dim  xlApp    'Excel Application Automation Object Reference
    Dim xlBook  'Reference to the workbook located in D:\
    Dim xlSheet 'Reference to Sheet1
    Dim iRow, sUserName, sPassword
    Const iUserNameCol = 1
    Const iPasswordCol = 2

    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Open("D:\TestFile.xls")
    Set xlSheet = xlBook.Worksheets("Sheet1")

    'SystemUtil.Run "iexplore.exe", "http://newtours.demoaut.com"

    For iRow = 2 to xlSheet.UsedRange.Rows.Count
        sUserName = xlSheet.Rows(iRow).Columns(iUserNameCol).Value
        sPassword = xlSheet.Rows(iRow).Columns(iPasswordCol).Value
        With Browser("title:=Welcome: Mercury Tours").Page("title:=Welcome: Mercury Tours")
            .WebEdit("name:=userName").Set  sUserName
            .WebEdit("name:=password").Set sPassword
            .Image("name:=login").Click
        End With
        If Browser("title:=Find a Flight: Mercury Tours:").Exist(15) Then
            Browser("title:=Find a Flight: Mercury Tours:").Link("text:=Home").Click
            Reporter.ReportEvent micPass,"Iteration " &iRow-1,"UserName:"&sUserName& "is valid"
        Else
            Reporter.ReportEvent micFail,"Iteration " &iRow-1,"UserName:"&sUserName& "is invalid"
            Browser("title:=Sign-on: Mercury Tours", "index:=0").Link("namet:=SIGN-ON").Click
        End If
    Next
    xlBook.Close
    xlApp.Quit
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing

  • 更改linux计算机的名字

    2012-03-02 14:20:36

    更改linux计算机的名字需要修改下面的两个文件:/etc/hosts 和/etc/sysconfig/network

    1.在/etc/hosts需要修改的部分:
    源文件的内容:
    127.0.0.1               localhost.localdomain localhost
    ::1             localhost6.localdomain6 localhost6

    修改计算机的名字为DNS1后,hosts文件的内容:
    127.0.0.1               DNS1.localdomain DNS1 localhost.localdomain localhost
    ::1             localhost6.localdomain6 localhost6


    2.在/etc/sysconfig/network需要修改的部分
    NETWORKING=yes
    NETWORKING_IPV6=no
    HOSTNAME=localhost.localdomain

    修改计算机的名字为DNS1后,/etc/sysconfig/network文件的内容:
    NETWORKING=yes
    NETWORKING_IPV6=no
    HOSTNAME=DNS1.localdomain



  • 关于activeX安全控件正确回放

    2012-03-01 16:01:22

    打开淘宝的登录界面,录制
    Browser("淘宝网 - 淘我喜欢!").Page("淘宝网 - 淘我喜欢!").WebEdit("TPL_username").Set "username"
    Browser("淘宝网 - 淘我喜欢!").Page("淘宝网 - 淘我喜欢!").ActiveX("EditCtrl Class").WinObject("ATL:Edit").Click 40,6
    Browser("淘宝网 - 淘我喜欢!").Page("淘宝网 - 淘我喜欢!").WebButton("登录").Click
    Browser("淘宝网 - 淘我喜欢!").Page("淘宝网 - 淘我喜欢!").WebEdit("TPL_password").SetSecure "password"

    运行后不能正确登录!


    修改代码后:
    Browser("淘宝网 - 淘我喜欢!").Page("淘宝网 - 淘我喜欢!").WebEdit("TPL_username").Set "username"
    Browser("淘宝网 - 淘我喜欢!").Page("淘宝网 - 淘我喜欢!").ActiveX("EditCtrl Class").WinObject("ATL:Edit").Click 121,15
    Browser("淘宝网 - 淘我喜欢!").Page("淘宝网 - 淘我喜欢!").ActiveX("EditCtrl Class").WinObject("ATL:Edit").Type "password"
    Browser("淘宝网 - 淘我喜欢!").Page("淘宝网 - 淘我喜欢!").WebButton("登录").Click

    可以成功的回放了



  • 如何点击左右键菜单上的内容

    2012-02-15 16:20:04

    下面的例子是是从右键菜单打开google大全
    1.将link对象对加到本地对象库并保存
    2.编写下面的代码
    Setting.WebPackage("ReplayType") = 2

    Browser("Google").Page("Google").Link("Google 大全").FireEvent "onclick", , ,micRightBtn

    Setting.WebPackage("ReplayType") = 1

    Index =1
    Set wshShell = CreateObject("Wscript.Shell")
    For i =1 to index
        WshShell.sendKeys "{DOWN}"

    Next
    WshShell.sendKeys "{ENTER}"
    Set WshShell = nothing

    这里面的重点是学习FireEvent的使用和QTP的两种运行模式
    1.Event模式  --  事件跟踪

    2. Mouse模式 --   鼠标跟踪

    Event模式就是我们平时默认用的模式,也就是事件,其实QTP的click方法只是触发了对象的CLICK事件,而并未真正通过鼠标来进行点击按钮。而如果我们使用的是Mouse模式的话,我们会看到回放的时候,鼠标是跟着对象走的,即鼠标跟踪模式。


    下面的例子是左键菜单的问题

    1.打开连接:http://ucenter.51cto.com/reg_01.php?reback=http%253A%252F%252Fwww.51cto.com%252F#

    录制录制代码:

    Browser("51cto用户注册").Page("51cto用户注册").WebCheckBox("guanzhu").Set "ON"
    Browser("51cto用户注册").Page("51cto用户注册").WebCheckBox("guanzhu_2").Set "ON"
    Browser("51cto用户注册").Page("51cto用户注册").Image("ico_queding").Click 15,9

    Browser("51cto用户注册").Page("51cto用户注册").WebCheckBox("hangye").Set "ON"
    Browser("51cto用户注册").Page("51cto用户注册").WebCheckBox("hangye_2").Set "ON"
    Browser("51cto用户注册").Page("51cto用户注册").Image("ico_queding").Click 21,12
    Browser("51cto用户注册").Page("51cto用户注册").WebList("companysize").Select "1000-4999人"

    运行后结果如下:

    2.将下面这个两个不能识别的对象添加到对象库并保存

     

    对象库显示如下

    3.修改代码(红色字体问修改的部分)

    Setting.WebPackage("ReplayType") = 2

    Browser("51cto用户注册").Page("51cto用户注册").WebElement("WebElement").FireEvent "onclick", , ,micLeftBtn

    Setting.WebPackage("ReplayType") = 1


    Set wshShell = CreateObject("Wscript.Shell")

    If true Then
        WshShell.sendKeys "{DOWN}"
        WshShell.sendKeys "{TAB}"
    End If
    Set WshShell = nothing

    Browser("51cto用户注册").Page("51cto用户注册").WebCheckBox("guanzhu").Set "ON"
    Browser("51cto用户注册").Page("51cto用户注册").WebCheckBox("guanzhu_2").Set "ON"
    Browser("51cto用户注册").Page("51cto用户注册").Image("ico_queding").Click 15,9

    Setting.WebPackage("ReplayType") = 2

    Browser("51cto用户注册").Page("51cto用户注册").WebElement("WebElement_2").FireEvent "onclick", , ,micLeftBtn

    Setting.WebPackage("ReplayType") = 1

    Index =1
    Set wshShell = CreateObject("Wscript.Shell")
    If true Then
        WshShell.sendKeys "{DOWN}"
        WshShell.sendKeys "{TAB}"
    End If
    Set WshShell = nothing

    Browser("51cto用户注册").Page("51cto用户注册").WebCheckBox("hangye").Set "ON"
    Browser("51cto用户注册").Page("51cto用户注册").WebCheckBox("hangye_2").Set "ON"
    Browser("51cto用户注册").Page("51cto用户注册").Image("ico_queding").Click 21,12
    Browser("51cto用户注册").Page("51cto用户注册").WebList("companysize").Select "1000-4999人"


    代码运行之后的结果如下:

  • QTP用户登录(使用Localsheet参数化)

    2012-02-09 09:53:18

    使用localsheet循环登录的例子
    Option Explicit

    Dim row
    Dim i

    row = DataTable.GetSheetCount

    For i = 1 to row
        Browser("title:=Welcome: Mercury Tours").Page("title:=Welcome: Mercury Tours").WebEdit("name:=userName").Set DataTable.GetSheet("Action1").GetParameter("Username")
        Browser("title:=Welcome: Mercury Tours").Page("title:=Welcome: Mercury Tours").WebEdit("name:=password").Set DataTable.GetSheet("Action1").GetParameter("password")
        Browser("title:=Welcome: Mercury Tours").Page("title:=Welcome: Mercury Tours").Image("name:=login").Click
        Browser("title:=Find a Flight: Mercury Tours:").Page("title:=Find a Flight: Mercury Tours:").Link("text:=Home").Click
        DataTable.GetSheet("Action1").SetNextRow
    Next


  • perl升级(5.8升级到5.14)

    2011-07-25 21:45:49

    1.下载新的软件
      wget http://www.cpan.org/src/5.0/perl-5.14.1.tar.gz
    2.安装和升级
    mkdir -p /usr/local/perl
    tar zxvf perl-5.14.1.tar.gz
    cd perl-5.14.1
    ./configure -des -D prefix=/usr/local/perl
    make
    make test
    make install
     mv /usr/bin/perl /usr/bin/perl.bak
    ln -s /usr/local/perl/bin/perl /usr/bin/perl
    3.查看perl的版本号
    perl -v
    This is perl 5, version 14, subversion 1 (v5.14.1) built for i686-linux

    Copyright 1987-2011, Larry Wall

    Perl may be copied only under the terms of either the Artistic License or the
    GNU General Public License, which may be found in the Perl 5 source kit.

    Complete documentation for Perl, including FAQ lists, should be found on
    this system using "man perl" or "perldoc perl".  If you have access to the
    Internet, point your browser at http://www.perl.org/, the Perl Home Page.
  • 什么是perl(Practical Extraction and Report Language)

    2011-07-20 12:48:22

    Perl是一种多用途的开源(免费软件)解释型语言。
    它主要用作脚本语言,并且运行在众多平台上。
    依据Wikipedia.org上面的说法:"Perl最初命名为'Pearl',它出自于Gospel of Matthew(《圣经马太福音》)中的'Parable of the Pearl'(珍珠的寓言)。"该寓言的简要内容如下:一位商人正在寻找珍珠,他找到一颗如此贵重、漂亮的珍珠,以至于他情愿倾其所有来购买它。最后,他 甚至比以往更富有。无论你怎样解释这则寓言,它都具有非常积极的寓意。

    如需获取有关Perl 6进展情况的进一步消息,请访问:

    http://www.perl.com/pub/a/2006/01/12/what_is_perl_6.html?page=2


    如需了解Larry Wall生平和Perl的历史,请访问

    http://www.softpanorama.org/People/Wall/index.shtml#Perl_history


  • 目标操作-------perl基础

    2011-07-14 15:29:46

    1.目录句柄
    从目录里获得文件名列表,可使用目录句柄。它不会启用另一个进程。
    下面程序的运行结果包含目录中所有的文件,包括.和..文件,并且没有排序。
    #!/usr/bin/perl
    use strict;
    use warnings;
    use 5.010;

    my $dir_to_process = "/etc";
    opendir DH, $dir_to_process or die "Can not open $dir_to_process:$!";
    foreach my $file (readdir DH){
       print "one file in $dir_to_process is $file\n";
    }
    closedir DH;

    去除所有以点开始的文件:
    my $dir_to_process = "/etc";
    opendir DH, $dir_to_process or die "Can not open $dir_to_process:$!";
    foreach my $file (readdir DH){
       next if $file =~ /^\./;
       #next if $file eq "." or $file eq "..";//去除.和..文件
       #next unless $file =~ /\.conf$/; 找出所有以.conf为结尾的文件
       print "one file in $dir_to_process is $file\n";
    }
    closedir DH;

    找出某个目录下的只读文件,并输出文件的全名,
    my $dirname = "/etc";
    opendir SOMEDIR, $dirname or die "Can not open $dirname:$!";
    while (my $file = readdir SOMEDIR) {
         next if $file =~ /^\./;
         $file = "$dirname/$file";
         next unless -f $file and -r $file;
         print "$file\n";
    }
    closedir SOMEDIR;

    2.perl使用unlink删除文件

    unlink "bb", "cc", "dd";
    unlink glob "*.conf";

    3.重命名文件
    rename "old" "new"

    下面的程序是批量的把以.old结尾的文件命名为以.new结尾的文件foreach my $file(glob "*.old"){
      my $newfile = $file;
      $newfile =~ s/\.old$/.new/;
      if (-e $newfile){
      warn "can't rename $file to $newfile:$newfile exists!\n";

      }elsif(rename $file, $newfile){
      }else{
      warn "rename $file to $newfile failed:$!\n";
      }
    }

    4.链接与文件 link, symlink, unlink
      link函数创建一个硬链接:
      link "bb.new", "bbb" or warn "can not link bb.new to bbb:$!";

      symlink函数创建一个符号链接:
      symlink "cc.new", "ccc" or warn "can not symlink cc.new to
      ccc:$!";
      if (-l "ccc"){
      print "ccc is a symlink.\n";
      }elsif(-e "ccc"){
      print "ccc is a file\n";
      }else{
      print "ccc is not existed.\n";
      }

      unlink可以删除上面的两种连接:
      unlink "ccc", "bbb" or warn "ccc or bbb not exist:$!";

      readlink:返回符号链接指向的位置,或在参数不是符号链接时返回undef。
      my $where =  readlink "ccc";
      print "$where\n";

    5.建立及移除目录mkdir and rmdir
      建立目录调用mkdir函数:
      mkdir "crl", 0755 or warn "can't make crl directory:$!";
      oct函数:强行把字符串当成八进制数处理,无论它是否以零开头。
      my ($name, $perm) = @ARGV;
      mkdir $name, oct($perm) or die "can not create $name: $!";
       ........... 

    6.修改权限chmod(只能接受数字)
      chmod  0755, "fred", "barney";

    7.更改隶属关系
      chown同时改变文件的拥有者和所属的组,但是用户标识和组标识必须以数字的形式来时定,如果不是数字的形式,则要用getpwnam将用户翻译成数字,getgrnam把组名翻译成数字:
      my $user = 101;
      my $group = 104;
      chown $user, $group, "crl";

      将/opt目录下所有的文件所属的用户名和组全部改为 apache和apache:
      defined(my $user = getpwnam "apache") or die "bad user";
      defined(my $group = getgrnam "apache") or die "bad group";
      chown $user, $group, glob "/opt/*";
     
    8.文件句柄

    文件句柄:程序里代表进程与外界之间的I/O联系的名字。
    open的用法:
    open CONFIG, "dino";
    open CONFIG, "<dino";
    open CONFIG, ">dino";
    open CONFIG, ">>dino";

    perl5.6以后,open的另一种新的用法

    open CONFIG, "<", "dino";
    open CONFIG, ">", $file_name;
    open CONFIG,  ">>", &logfile_name();


    作业题目:
    用户键入一个目录名称,并从当前目录切换过去,如果输入的一行空白字符,则会以主目录作为默认目录,所以应切换到他本人的主目录中,切换后输出目录的内容(不含以点开头的文件)并按照英文字母顺序排列,若切换目录失败,则有相应的警告信息,但不必输出目录的内容。
    print "which directory?\n";

    chomp(my $dir = <>);

    if ( $dir =~ /^\s*$/ ){
      chdir or die "Can't chdir to your home directory:$!";
    }else{
      chdir $dir or die "can't change to $dir:$!\n";
    }

    my @files = <*>;
    # my @files = <.* *>; 包含隐藏文件

    foreach(sort @files){
      print "$_\n";
    }
    运行结果:
    /opt/script  
    1
    7
    aa.odd
    bb
    bb.new
    bbb
    cc.new
    ccc
    chai.pl
    chapter10.pl
    chapter13.pl
    chapter14.pl
    chapter15.pl
    crl
    dd.old
    hash
    hw.pl
    learn.pl
    shuzu.pl

    使用文件句柄做上面的题目:

    print "which directory?\n";

    chomp(my $dir = <>);


    if ( $dir =~ /^\s*$/ ){
      chdir or die "Can't chdir to your home directory:$!";
    }else{
      chdir $dir or die "can't change to $dir:$!\n";
    }

    opendir DIRS, "." or die "can't open $dir:$!";

    foreach (sort readdir DIRS){
     #next if $_ =~ /^\./; 不打印以.开头的文件
     print "$_\n";
    }



    编写类似于rm的功能的程序
    ......





  • 智能匹配--given-when结构-------perl基础

    2011-07-12 16:03:12

    1.智能匹配操作符~~
      新的智能匹配操作符会根据需要自己决定用何种方式比较两端的操作数

    下面这两段程序具有相同的效果
    写法一:
    my @name1 = / 1 2 3 4/;
    my @name2 = /1 2 3 4 /;
    my $equal = 0;
    foreach my $index ( 0..$#name1){
    last unless $name1[$index] eq $name2[$index];
    $equal++;
    print "$equal";
    }
    print "the arrays have the same element.\n" if $equal == @name1;

    写法二:

    my @name1 = / 1 2 3 4/;
    my @name2 = /1 2 3 4 /;
    say "the arays have the same element.\n" if @name1 ~~ @name2;

    下面的例子是:在调用某个函数后,检查它的返回结果是否在某个集合中存在的两种写法.
    写法一:
    my @nums = qw( 2 3  42 27);
    my $result = max( @nums );
    my $flag = 0;

    sub max{
      my ($max_so_far) = shift @_;
      foreach( @_ ) {
      if ($_ > $max_so_far ){
        $max_so_far = $_;
       }
     }
      return $max_so_far;
     #print "$max_so_far\n";
    }

    foreach my $num ( @nums ){
       next unless $result == $num;
       $flag = 1;
       #print "$flag\n";
       last;
    }
    print "the value is existed.\n" if $flag;


    写法二:
    my @nums = qw( 2 3  42 27 );
    my $result = max( @nums );
    say "$result\n";
    sub max{
      my ($max_so_far) = shift @_;
      foreach( @_ ) {
      if ($_ > $max_so_far ){
       $max_so_far = $_;
       }
     }
      return $max_so_far;
    }
    print "the values is existed\n" if $result ~~ @nums;

    print "the values is existed\n" if @nums ~~ $result;//为什么这么写没有运行结果,书上说智能匹配对两边操作数的顺序没有要求。这两种写法应该有同样的运行结果才对,可实际结果不对。

    2.智能匹配操作的优先级
    例子                            匹配方式
    %a ~~ %b                     哈希键是否一致
    %a ~~ @b                  至少%a中的一个键在列表@b中
    %a ~~ /fred/              至少一个键匹配给定的模式
    %a ~~ 'fred'              哈希中某一指定键$a{fred}是否存在
     
    @a ~~ @b                  数组是否相同
    @a ~~ /fred/              有一个元素匹配给定的模式
    @a ~~ 123                 至少有一个元素转化位数字后123
    @a ~~ 'fred'              至少有一个元素转化为字符串后是 'fred'

    $name ~~ undef            $name确实尚未定义
    $name ~~ /fred/           模式匹配
    123 ~~ '123.0'            数字和字符串是否大小相等
    'fred' ~~ 'fred'          字符串是否完全相同
    123 ~~ 456                 是否大小相等

    3.given基本语句,given会将参数化名为$_,每个when条件测试都会尝试用智能匹配对$_进行测试。
    use 5.010
    given( $ARGV[0] ){
      when ( /fred/i ) { say 'Name has fred in it' }
      when ( /^fred/ ) { say 'Name start with fred'}
      when ( 'Fred' )  { say 'Name is Fred' }
      default          { say "I don't see a Fred" }
    }

    Continue的用法:

    given( $array[0] ){
      when ( /fred/i ){ say 'name has fred in it';continue }
      when ( /^fred/ ){ say 'name start with fred';continue }
      when ( 'Fred' ) { say 'name is Fred' }
      default         { say "i don't see a Fred" }

    }

    4.多个项目的when匹配
      要遍历多个元素,就不用given,使用foreach的简写方式让他给当前正在遍历的元素起个化名$_,此外,若要使用智能匹配,当前元素就只能是$_.

    #!/usr/bin/perl;
    use 5.010;
    my @array = qw/ Fred is good /;
    foreach (@array) {
      when ( /fred/i ){ say 'name has fred in it';continue }
      when ( /^fred/ ){ say 'name start with fred';continue }
      when ( 'Fred' ) { say 'name is Fred' }
      default         { say "i don't see a Fred" }

    }
    运行结果如下:
    name has fred in it
    name is Fred
    i don't see a Fred
    i don't see a Fred



  • 哈希的简单应用--hash

    2011-07-06 10:19:23

    1.访问哈希
      1)访问哈希元素
        $hash{$some_key}
        $family_name{"fred"} = "rubble"; //哈希键可以是字符串
        $family_name{"fred"} = "astaire";
        $bedrock = $family_name{"fred"};//若对某个已存在的哈希元素赋值,
         就会覆盖之前的值
        $family_name{"wilma"} = "astaire";
        $family_name{"betty"} .= $family_name{"wilma"};//哈希元素会因为赋值而诞生
         访问哈希表里不存在的值就会返回undef;
      2)访问整个哈希
         %family_name; //指代整个哈希
         在列表上下文中,哈希会自动变成一些简单的键值对,叫做哈希松绑。
         @array = %family_name;

    2.哈希赋值
      %new_hash = %old_hash; //用法不常见
      %inverse_hash = reverse %any_hash;  //常见的用法
      my %last_name = (
        "fred" => "flintstone",
        "dino" => "undef",
        "barney" => "rubble",
      );
    3.哈希函数
      keys函数:返回指定的 HASH 里的所有键字组成的一个列表。
      keys %hash;
      values函数:返回一个包含指定散列 HASH 里的所有值的列表。
      values %hash;
     
       #!/usr/bin/perl
       use strict;

       my %hash =(
         "a" => 1,
         "b" => 2,
         "c" => 3,
        );
       my @k = keys %hash;
        print "@k\n";
       my @v = values %hash;
       print "@v\n";
       my $count = keys %hash;
       print "$count\n";
       输出结果:
       c a b
       3 1 2
       3
       each 函数以一次一个键/值对的方式遍历一个散列。在列表环境中,each 返
       回 一个两个元素的列表,该列表包含散列中下一个元素的键字和数值。如果在
       标量环境里调用,each 只是返回散列中下一个元素的键字。如果散列已经全部
       读取完了,那么返回一个空列表,如果你给这个空列表赋值,那么在标量环境中
       会生成一个假值
       each %hash;
        while(($key, $values) = each %ENV){
           print "$key = $values\n";
         }
       delete函数:能从哈希中删除指定的键和对应的值;
       my $person = "betty";
       delete $books{$person};
       exists函数:若要检查哈希中是否有某个键,可用此函数返回真或假值,分别表
       示键存在与否,与对应的值无关。
       print "hey,there is a library card for dino!\n" if exists
       $book{"dino"};
       print "Exists\n" if exists $hash{$key};
      
    4.作业题
      读入用户指定的名字并汇报相应的姓。

  • 子程序--perl

    2011-06-25 09:49:18

    1.当使用use strict编译命令时,perl会要求你一定要用my来声明每个新的变量
      #!/usr/bin/perl
      use strict;

      sub sum_of_fred_and_barney{
      print "hey,you called the sum_of_fred_and_barney subroutine.\n";
      return $fred + $barney;  #从子程序种立刻返回某个值,若没有return会 将子程序最后执行的表达式的直返回;
      print;
      }
      my $fred = 3;
      my $barney = 4;
      my $wilma = &sum_of_fred_and_barney;
      print "wilma is $wilma.\n";
      my $betty = &sum_of_fred_and_barney;
      print "betty is $betty.\n";
    否则会有如下的错误提示:
    Global symbol "$fred" requires explicit package name at ./chapter4.pl line 9.
    Global symbol "$barney" requires explicit package name at ./chapter4.pl line 10.
    Global symbol "$wilma" requires explicit package name at ./chapter4.pl line 11.
    Global symbol "$wilma" requires explicit package name at ./chapter4.pl line 12.
    Global symbol "$betty" requires explicit package name at ./chapter4.pl line 13.
    Global symbol "$betty" requires explicit package name at ./chapter4.pl line 14.

    2.在my不使用()时,只能声明单个词法变量
      my $fred;   正确
      my ($fred, $barney); 正确
      my $fred, $barney;错误

    3.当子程序与perl的内置函数不同名且子程序的声明放在子程序被调用之前时,
      可以将子程序调用符号&以及参数的括号省略掉
     
      #!/usr/bin/perl
      sub division{
      $_[0] / $_[1];
      }
      $quotient = division 10, 2;
      print $quotient;
    4.在子程序中可以使用my操作符来创建私有变量,但每次调用这个字程序的时候,
      这个私有变量就会被重新定义。使用state声明变量,可以在子程序多次调用期
      间保留变量的值并将变量的作用域局限于子程序。(注意:不能初始化state声
      明的数组和散列)
     
      #!/usr/bin/perl
      use strict;
      use 5.010;
      running_sum( 5, 6 );
      running_sum( 1..3 );

      sub running_sum{
        state $sum = 0;
        state @numbers;

        foreach my $number(@_){
          push @numbers, $number;
          $sum += $number;
        }
       say "the sum of (@numbers) is $sum";
      }
       输出结果是:
       the sum of (5 6) is 11
       the sum of (5 6 1 2 3) is 17
    作业题目:求1到1000的和
     
      #!/usr/bin/perl
      use strict;
      use 5.010;
      running_sum(1..1000);
      sub running_sum{
        state $sum = 0;
        state @numbers;
        foreach my $number(@_){
           push @numbers, $number;
           $sum += $numbser;
        }
       say "the sum is $sum";
      }
     

  • Linux 下如何设置locale

    2011-05-11 14:19:20

    1.打开文件/etc/sysconfig/i18n:
      更改变量:LANG=设置为您需要的环境变量,例如:
      LANG=en_US.utf8
      其中LANG的值可以在/usr/lib/locale目录下查找到。
    2.Locale命名以及参数解释
    locale的命名规则为<语言>_<地区>.<字符集编码>,如zh_CN.UTF-8zh代表中文,CN代表大陆地区,UTF-8表示字符集。在locale环境中,有一组变量,代表国际化环境中的不同设置:

    LC_COLLATE 

    定义该环境的排序和比较规则

    LC_CTYPE

    用于字符分类和字符串处理,控制所有字符的处理方式,包括字符编码,字符是单字节还是多字节,如何打印等。是最重要的一个环境变量。

    LC_MONETARY

    货币格式

     LC_NUMERIC

    非货币的数字显示格式

    LC_TIME

    时间和日期格式

    LC_MESSAGES

    提示信息的语言。另外还有一个LANGUAGE参数,它与LC_MESSAGES相似,但如果该参数一旦设置,则LC_MESSAGES参数就会失效。LANGUAGE参数可同时设置多种语言信息,如LANGUANE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"

    LANG

    LC_*的默认值,是最低级别的设置,如果LC_*没有设置,则使用该值。类似于 LC_ALL

    LC_ALL

    它是一个宏,如果该值设置了,则该值会覆盖所有LC_*的设置值。注意,LANG的值不受该宏影响。



  • SVN 安装与配置(基于apache)

    2011-05-09 10:55:10

    1.      获取相关的软件包

    wget http://subversion.tigris.org/downloads/subversion-1.6.2.tar.gz

    wget http://subversion.tigris.org/downloads/subversion-deps-1.6.2.tar.gz

    wget http://mirror.bjtu.edu.cn/apache//httpd/httpd-2.2.17.tar.gz

    2.         安装apache svn

    Ø  安装Apache

    #tar zxvf httpd-2.2.17.tar.gz

    #cd httpd-2.2.17

    #./configure --prefix=/usr/local/apache --enable-dav --enable-so --enable-rewrite --enable-ssl --enable-maintainer-mode  --with-mpm=worker

    #make && make install

    #make clean

    启动服务:

    #/usr/local/apache2/bin/apachectl –k start

    Ø  安装svn

    # mkdir /usr/local/svn

    # tar zxvf subversion-1.6.2.tar.gz

    # tar zxvf subversion-deps-1.6.2.tar.gz

    # cd subversion-1.6.2

    # ./configure --prefix=/usr/local/svn --with-apr-util=/usr/local/apache2 --with-apr=/usr/local/apache2 --with-apxs=/usr/local/apache2/bin/apxs --enable-maintainer-mode --with-zlib=/usr/local/zlib --with-ssl

    # make && make install

    3.         配置svn服务器

        # useradd apache

    #passwd apache

    # mkdir -p /var/repos

    # cd /usr/local/svn/bin/

    # ./svnadmin create /var/repos/test

    # ll /var/repos/test (查看此目录下是否多了些内容,如果是,svn安装成功)

    # chmod 700 /var/repos

    #chown -R apache:apache /var/repos

    # vi /usr/local/apache2/conf/httpd.conf 修改http.conf

    User daemon 改为:User apache

    Group daemon 改为:Group apache

    添加下面的内容:

           <Location /svn>

               DAV svn

               SVNParentPath /var/repos/

               AuthzSVNAccessFile //var/repos/authz

               AuthType Basic

               AuthName "clo.com.cn"

               AuthUserFile /var/repos/authfile

               Require valid-user

    </Location>

    # vi /usr/local/apache2/conf/extra/httpd-vhosts.conf作如下配置:

    <VirtualHost *:80>

               ServerAdmin webmaster@dummy-host3.example.com

               DocumentRoot "/var/repos/test"

               Alias /test "/var/repos/test"

               <Directory "/var/repos/test">

               Options Indexes FollowSymLinks

               AllowOverride None

               Order allow,deny

               Allow from all

               </Directory>

               ServerName 172.16.31.235/test

               ErrorLog /var/repos/test/svn-error_log

               CustomLog /var/repos/test/svn-access_log common

    </VirtualHost>

    # /usr/local/apache2/bin/htpasswd -c /var/repos/authfile username password

    # cp /var/repos/test/conf/authz /var/repos

    vi /var/repos/authz 按下面内容修改:

    [groups]

    test = apache,wanjl

    [test:/]

    @test = rw

    # cd /var/repos/test/conf/

    # rm -rf authz passwd

    # /usr/local/apache2/bin/apachectl -k start

    # /usr/local/apache2/bin/htpasswd -c /var/repos/authfile apache

    # /usr/local/apache2/bin/htpasswd -c /var/repos/authfile wanjl

    4.         通过浏览器访问svn服务器

    打开IE输入svn服务器地址:http://172.16.31.235/svn/test/

    5.         通过客户端访问svn服务器

    http://tortoisesvn.net/downloads网站下载TortoiseSVN最新版,然后按默认安装即可。

    安装完毕后,在桌面上点击右键->TortoiseSVN->Repo-Browser将弹出下面的界面,输入

    http://172.16.31.235/svn/test/

  • linux DNS 的源码安装

    2008-11-26 17:49:51

    1.wget http://ftp.isc.org/isc/bind9/9.2.9/bind-9.2.9.tar.gz 下载源码安装包

    2.tar zxvf bind-9.2.9.tar.gz  这样源码就解压到bind-9.2.9目录下

    3.cd bind-9.2.9

    4../configure --prefix=/usr/local/bind  --sysconfdir=/etc/bind --localstatedir=/var --with-libtool --enable-threads

    configure 是编译前对源代码进行针对具体操作系统的编译参数配置,有很多选项可以选择:

    --prefix:指定安装目录

    --sysconfdir:设置named.conf配置文件放置的目录

    --localstatdir:设置 run/named.pid 放置的目录

    --with-libtool:将BIND的库文件编译为动态共享库文件,这个选项默认是未选择的。

    --enable-threads:如果你的系统有多个CPU,那么可以使用这个选项

    5. make && make install

    编译和安装,安装时需要有root权限

  • 文件所有者及权限

    2008-10-15 16:40:06

    1.常规文件的所有者及权限

    1)文件有一个用户所有者、一个组所有者、一组权限

    文件有三种权限类型:(r)可读、(w)写入、(x)可执行;三种访问级别:(u)用户所有者、(g)组所有者及(o)其它

    2)改变文件权限:chmod

    chmod (ugoa)+/-/=(rwx) filename

    3)改变组所有者:chgrp 和改变用户所有者: chown

    chgrp GROUP file

    chown USER FILE

    2.目录所有者及权限

    目录也是文件,所以也有用户所有者、组所有者、一组权限

    在内核级别,linux使用默认模式666(rw-rw-rw)建立文件

    在内核级别,linux使用默认模式777(rwxrwxrwx)建立目录

  • 检查用户信息

    2008-10-15 15:39:53

    1.id命令用于显示用户信息和组信息

    id [-g] [-G] [-u] [-n] [USERNAME]

    -g:只打印主要组ID

    -G:打印所有组ID

    -u:只打印有效用户ID

    -n:打印用户名和组名称,不能单独使用,需要配合上面三个选项

    2.whoami 获取当前用户的用户名

    3.who、users、w查看正在会话中的用户

    w

    USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
    web  pts/1    192.168.1.100    14:31    0.00s  0.11s  0.02s w

    USER:登陆用户的用户名

    TTY:用户登录终端

    FROM:如果用户从网络上登录,用户使用的主机名

    LOGIN@:用户开始会话的时间

    IDLE:终端已经空闲的时间

    JCPU:与终端会话相关的,所有当前运行进程消耗的cpu的时间总量

    PCPU:在“what”字段中命名的唯一一个进程所消耗的cpu的时间总量

    WHAT:用户的当前运行进程

    w -h 跳过标题

    web0  pts/1    192.168.1.100    14:31    0.00s  0.14s  0.01s w -h

    w -s 简短列

    USER     TTY      FROM               IDLE WHAT
    web  pts/1    192.168.1.100    0.00s w -s

    w -f 不显示 from 字段

    USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
    web pts/1     14:31    0.00s  0.17s  0.01s w -f

    4.finger用户何时最后登陆系统及其他信息

    finger [-s] [-l] [-p]  [ USER....] [USER@HOST....]

    -s 概要形式输出

    Login     Name       Tty      Idle  Login Time   Office     Office Phone
    web   web   pts/1          Oct 15 14:31 (192.168.1.100)

    -l 详细格式输出

    Login: web                              Name: web
    Directory: /home/webroot                Shell: /bin/bash
    On since Wed Oct 15 14:31 (EDT) on pts/1 from 192.168.1.100
    No mail.
    No Plan.

    -p 不显示".plan" ".project"

    Login: webroot                          Name: webroot
    Directory: /home/webroot                Shell: /bin/bash
    On since Wed Oct 15 14:31 (EDT) on pts/1 from 192.168.1.104
    No mail.

    5.su 改变用户身份

    su [-] [-c] [-m, -p] [-s, --shell= SHELL] [USER [ARG]]

    -  使shell成为登陆shell

    -c 运行指定命令,然后返回

    -m,-p 保持当前环境

    -s  用SHELL 作为新用户的Shell

    newgrp(sg)转换主要组

    newgrp [GROUP]

  • Linux用户和组

    2008-10-09 16:32:55

    在系统底层,一个用户有一个叫做用户ID(uid)的整数表示

    在系统中的每一个进程以一个给定的uid运行

    文件系统中的每个文件有唯一的uid和gid

    /etc/passwd文件把uid映射到用户账户上,用户帐户把uid映射到用户名、密码、组id、主目录和登陆Shell

    1.Linux用户和/etc/passwd文件

    /etc/passwd中的字段:用户名、密码、用户id、主要组id、GECOS(基本不怎么使用)、主目录、登陆Shell

    2.Linux租和/etc/group文件

    基本上,一个组就是一个整数组ID(gid),每个在系统上运行的进程都是属于一个组的集合(gids)

    /etc/group文件把组id映射到组名称和组成员身上

    用户有一个在/etc/passwd文件中定义的主要组

    用户可以是在/etc/groups文件中定义多个次要组的成员

    /etc/groups中的字段:组名称、组密码、组ID、组成员

  • 文件和目录管理命令

    2008-10-09 14:23:17

    1.cp命令

    cp [options] {source} {target} /cp [options] {source} {directory}

    示例:

    (1)复制文件mysong.midi, 将文件命名为backup.midi.

      cp mysong.midi backup.midi

    (2)复制一个或多个文件到某一个目录下

       cp mynovel.txt /tmp 或者 cp mysongs.tar mynovels.tgz /tmp

    (3)从主目录复制文件到当前目录下

       cp ~/webpage.html .

    (4) cp -r 递归复制目录

    2.使用mv移动或重新命名文件

    mv [options] {source} {target} /mv [options] {source} {directory}

    (1)将文件重新命名为backup.midi.

      mv mysong.midi backup.midi

    (2)移动一个或多个文件到某一个目录下

       mv mynovel.txt /tmp 或者 mv mysongs.tar mynovels.tgz /tmp

    (3)将文件从主目录移动到当前目录下

       mv ~/webpage.html .

    注意:mv命令,如果目标目录存在,将原来的目录移动到目标目录中,如果目标目录不存在,就重新命名原来的目录

    3.rm 命令清除或删除文件

    rm [options] {files}

    rm -r 递归删除目录

    4.mkdir(make directory)建立(新的、空的)目录;rmdir删除(清空)目录

    mkdir [options] {directory} / rmdir [options] {directory}

231/212>
Open Toolbar