2005年05月27日

 文章转载自Skillart BBS,终于发现原因并不是MSDE没有卸载干净,而是因为我装了
Active Directory把机器做成了域控制器,这下非装SQL Server2000不可了,否则又是
没有域不能添加用户。
>
> SharePoint Portal Server 的安装大体上可以一路Next 来完成,作为微软公司的一
个 Server 产品而言,安装起来并不困难,也没有太多的选项需要配置。然而,即便如
此,还是有很多人安装失败!因此我总结了一下安装过程中应该注意的要点,这些内容
参考了 Microsoft SharePoint Portal Server 2003 自述文件、管理手册等资料:
>
> 1、操作系统:SharePoint Portal Server 安装所在服务器的操作系统必须是
Windows Server 2003 的一个版本(标准版、企业版、数据中心版、Web版)。并且安
装所有的Windows Update 补丁。尽管现在 Windows Server 2003 SP1还处在 Bata 阶
段,但根据本人实际测试,在 Windows Server 2003 Service Pack 1 Bata 1 Version
1137上,SharePoint Portal Server 运行良好!
>
>
>
> 2、内存:如果在“配置服务器拓扑结构”设置中要将Web服务、搜索服务和索引服务
全部激活,作业服务器也使用该服务器来运行的话,则服务器的内存要求则至少320M。
《Microsoft Office SharePoint Portal Server 2003 自述文件》上对内存配置的最
低要求描述为512M。根据个人的试验,如果SPS是作为测试用的话,320M内存是必不可
少的,低于该内存配置则会频频跳出执行错误的警告框。如此看来,1G内存配置对于生
产环境来讲应该算是标准配置了吧!
>
>
>
> 3、文件系统格式和空间:操作系统分区和将要在其上安装 SharePoint Portal
Server 组建的任何分区(包括安装期间为程序和数据文件选择的路径)都必须采用
NTFS文件系统格式,并且磁盘配额没有限制或限制大小足够使用。操作系统磁盘驱动西
上必须至少有300M磁盘空间,安装期间选择的程序文件安装目录中至少有200M空间,在
安装期间选择的数据文件的安装目录中必须有75M空间。
>
>
>
> 4、数据库:数据库的安装曾令我非常迷惑,自己曾安装 SharePoint Portal Server
不下20次,有的时候安装附带的MSDE可选,而有的时候则不允许安装MSDE。现在终于总
结其原因:如果将SharePoint Portal Server安装在域控制器上的话,则只能使用SQL
Server 2000作为数据存储,安装过程中不允许选择附带的MSDE。如果安装 SPS 的服务
器是一个域成员服务器的话,则可以不安装SQL Server,而使用MSDE。由于 SQL
Server 2000 本身和 Windows Server 2003操作系统不兼容,必须给SQL Server 2000
安装Service Pack 3a,这一点如果您在未给数据库安装SP的话,可能会出现SPS连不上
数据库或者在开始配置SPS的时候出现提示,要求您必须给数据库SQL Server安装SP3。
SharePoint Portal Server 2003的安装光盘上附带的MSDE则已经是SP3a的版本,所以
使用MSDE的情况下无需安装数据库补丁。MSDE 2000 在支持的数据大小和其他方面存在
一定限制。如果超出这些限制,SharePoint Portal Server 2003 将不能正常工作。所
以生产环境下最好使用SQL Server 2000。
>
>
>
> 5、操作系统语言设置:所有非英语版本的 SharePoint Portal Server 2003 必须安
装在具有相应区域设置的服务器上。如果区域设置不匹配,安装会失败。这一点我还没
有深切的体会,安装自述文件上对此有明确的要求。
>
>
>
> 6、SPS和Visual Studio.net 2003共存问题:由于SPS的安装过程中要对服务器操作
系统上的IIS默认80端口的服务器扩展升级成WSS扩展,而非FrontPage扩展,所以默认
情况下Visual Studio.NET 2003安装会失败。如果要将VS.NET和SPS安装在同一台服务
器上,则可以按照合理的步骤安装成功:首先安装SPS,并对服务器IIS作相应的WSS扩
展,然后在IIS中新建站点,分配非80端口,配置WSS扩展,将80端口改回FrontPage扩
展。此时SPS可以运行在非80端口的站点上,再安装VS.NET的时候就可以顺利进行下去
了。SPS自述文件中说明Microsoft的知识库文章822837描述了该问题,但我始终没有找
到该文章!那位置到该文档位置的话请告知!
>
>
>
> 7、向后兼容文档库:SharePoint Portal Server 2003 的向后兼容文档库服务器组
件不能在安装了以下软件的服务器上运行:Microsoft Exchange Server(任何版
本)、Microsoft FrontPage Server Extensions,对于小型、中型和大型服务器场部
署,不能在同一计算机上安装向后兼容文档库组件和 SQL Server 2000。向后兼容文档
库仍然使用和Exchange Server存储格式相同的Web Storage System作为存储方式。SPS
3003则将所有的文件放在了数据库中,这应该是SPS两个版本最大的区别了。
>
>
>   8、客户端:客户端没有额外的要求,Windows系统、IE、Outlook Express,但
要发挥SPS的高级特性,则客户端安装Office 2003还是需要的。至少目前我在使用多文
件上传、文档库的资源管理器视图时发现该问题。那么客户端的操作系统至少应该是
2000以上了!

2004年12月03日

北京部分家装市场地址营业时间

2004年11月26日

















































































[1] Blowfish模块
作者:hoowa


总在这里问东西也不能不给这里的朋友点东西
这是我刚刚做的,给你资料你整理一下就可以用了:)

Blowfish是一个强壮的可变长度由8个字节到56个字节(448位钥匙)的加密技术。
只有在双方持有相同的钥匙情况下才有可能解密数据。
他照比DES算发具有更高的安全性(目前无法破解)。
而且他的加密速度是最快的!
这里不讲他如何做的算法。我们只讲Crypt::Blowfish如何使用。

安装:
win32系统:
输入ppm命令,然后输入install Crypt::Blowfish回车等待安装结束,或search blowfish查看列表。

Linux下请到www.cpan.org下载模块,编译安装需要gcc

此模块是使用的最小8字节长度,最大56字节长度,在编写钥匙的时候如果不符合这个范围那么就将出现错误。
在加密的时候,需要将所加密的字符穿分割成为多个8字节长度的字符串,如果不够8字节可以填充空格等特殊字符。

以下是举例:







代码:

#!/usr/bin/perl
use Crypt::blowfish; #加载模块


#需要加密的资料
$data = qq~欢迎光临www.ilcatperl.org这里是Perl的天堂
欢迎喜欢Perl
如果你觉得Perl不行,那就是你水平太臭,回家看孩子玩吧~;

#构造对象
my $fish = new Crypt::Blowfish ‘this is my key’; # 8 bytes < Key > 56 bytes

#编码
@data = &block($data); #将数据以8个字节块化,如果最后不够补充空格

foreach (@data) {
   $encode .= $fish->encrypt($_);
}

#解码
@data = &block($encode); #将数据以8个字节块化,如果最后不够补充空格

foreach (@data) {
   $decode .= $fish->decrypt($_);
}


#块化子程序
sub block
{
   my ($string) = @_;
   my (@blocks,$last_length,$nu,$ad);
   my @blocks = unpack(“a8 “x(int(length($data)/) . “a*”, $string);

   $last_length = length($blocks[$#blocks]);

   if (($nu = 8 – $last_length) > 0) {
      for (my $i=1;$i<=$nu ;$i++) {
         $ad .= ‘ ‘;
      }
   }
   $blocks[$#blocks]= $blocks[$#blocks].$ad;
   
   return(@blocks);
}

#以上代码encode是编码后decode是解码后
#coding by hoowa



_________________
欢迎访问:http://www.bang5.com/
谢谢!
呵呵:)


最后进行编辑的是 deathcult on 2003-06-10 16:06, 总计第 1 次编辑
返回页首




中国BBS社区100强评比,支持CU,请再投CU一票,谢谢!
此人为版主 deathcult   性别:帅哥  
版主 – 大天使


大天使
注册时间: 2002-07-22
最后登录: 2004-11-10
帖子总数:
2089
精华帖子: 18
原创精华: 6
来自: www.bang5.com
BLOG主页:
进入
在线状态: …保密…









帖子总数发表于: 2003-06-10 16:06    发表主题: 举报此帖 引用并回复




[2] 父进程与子进程communicate..利用PIPE的例子
作者:apile


# 本程序主要利用PIPE来建立Parent Process与Child Process间的互相连通,
# 利用%STATUS纪录目前Child Process的所有状态,与%CHILDREN纪录所有的Child
# Process。
# Parent Process:负责由CHILD_READ中读取所有CHILD Process的输入,并纪录
# 这些Process目前的状态。当收到INT、HUP、TERM等Signal时,即跳出主要loop
# 并将所有child Process全部杀光…







代码:

#!/usr/bin/perl
use strict;
use IO::Select;
use POSIX qw(WNOHANG);

#—Define constants:定义准备先fork几个Process
use constant PREFORK_CHILDREN   => 3;
# debugging information:显示过程
use constant DEBUG              => 1;

# declare globals
my $DONE=0;             # set flag to true when server done
my %STATUS = ();        #child status information, child pid form keys of the ha
sh, status form the values
#— 纪录所有Child Process的id…
my %CHILDREN = ();
#—Interrupt handles,跳出loop
$SIG{TERM} = $SIG{INT}=$SIG{HUP} = sub { $DONE++ };
#— get CHLD Signal
$SIG{CHLD} = sub {
         while((my $child=waitpid(-1,WNOHANG)) > 0){
           delete $CHILDREN{$child};
         }
      };
# create a pipe for IPC:建立PIPE
pipe(CHILD_READ,CHILD_WRITE) or die “Can’t make pipe!\n”;
my $IN = IO::Select->new(\*CHILD_READ);
# prefork some children
make_new_child() for (1..PREFORK_CHILDREN);

# main loop
while(!$DONE){
  # avoid parent block in the I/O call
  if ($IN->can_read){ # got a message from one of the children
    my $message;
    next unless sysread(CHILD_READ,$message,4096);
  # may contain several messages
    my @messages = split “\n”,$message;
  # retrive every pid and status code
    foreach (@messages){
      next unless my ($pid,$status) = /^(\d+) (.+)$/;
  # change status
      if($status ne “done”){
         $STATUS{$pid} = $status;
      }else{
  # delete pid
         delete $STATUS{$pid};
      }
    }
  }

  warn join(‘ ‘,map {“$_=>$STATUS{$_}”} keys %STATUS),”\n” if DEBUG;
  last unless %CHILDREN
}
warn “Termination received, killing children\n” if DEBUG;
#————-杀掉所有Child Process
kill TERM => keys %CHILDREN;
sleep while %CHILDREN;

warn “Normal termination.\n”;
exit 0;
#—- 建立新的Process
sub make_new_child{
  die “can’t fork :$!” unless(defined( my $child = fork()));
  if($child){   # child > 0, so we’re the parent
    $CHILDREN{$child} = 1;
    warn “launching child $child\n” if DEBUG;
  }else{
    close CHILD_READ;   # no need to read from pipe
    do_child();         # child handles incoming connections
    exit 0;             # child is done
  }
}
#—— child process
sub do_child{
   # write status code: idle
   syswrite CHILD_WRITE,”$$ idle\n”;
   for(1..1000000){ };
   syswrite CHILD_WRITE,”$$ busy\n”;
   for(1..1000000){ };
   syswrite CHILD_WRITE,”$$ done\n”;
}




_________________
欢迎访问:http://www.bang5.com/
谢谢!
呵呵:)
返回页首




中国BBS社区100强评比,支持CU,请再投CU一票,谢谢!
此人为版主 deathcult   性别:帅哥  
版主 – 大天使


大天使
注册时间: 2002-07-22
最后登录: 2004-11-10
帖子总数:
2089
精华帖子: 18
原创精华: 6
来自: www.bang5.com
BLOG主页:
进入
在线状态: …保密…









帖子总数发表于: 2003-06-11 11:06    发表主题: 举报此帖 引用并回复




[3] 父进程与子进程communicate..利用IPC::Shareable的例子
作者:apile

Hi…這是昨天那個例子改用share memory的方式,兩相比較..我覺得
PIPE比較好點…尤其是有大量資料需要互傳的時候…
———————————————————————————
本程序主要使用IPC::Shareable module来建立一块共同的share memory
以为所有程序所用,主要利用tie将%STATUS、%status与IPC::Shareable
tie在一起,其中SHM_GLUE用来向OS做注册一块memory的識別符號,因
此若程序失败, 未能正常清除share memory,必须利用OS提供的share
memory工具清除, 否则程序将无法启动。linux可以使用ipcrm清除
Parent Process利用sleep(),不做任何动作,而child Process的状态,
透过kill -ALARM getppid() 通知Parent,child Process的status已经
改变了..
———————————————————————–






代码:

#!/usr/bin/perl -w
# p_shm.pl

#—- 加载 module包含IPC::Shareable
use strict;
use POSIX qw(WNOHANG);
use IPC::Shareable;

#—- 定义常数
use constant PREFORK_CHILDREN => 3;
#— 定义识别文字
use constant SHM_GLUE => ‘PERF’;
#— 查测过程
use constant DEBUG => 1;

#— 宣告全域变量
my $DONE = 0; # set flag to true when server done
#— 纪录CHILD的STATUS
my %STATUS = ();
my %CHILDREN=();

#— 抓取Signal INT,TERM,ALRM—-
$SIG{INT} = $SIG{TERM}= sub{ $DONE++ };
$SIG{ALRM} = sub {}; # receive alarm clock signals, but do nothing
#—-抓取 signal : CHLD
$SIG{CHLD} = sub {
while((my $child=waitpid(-1,WNOHANG)) > 0){
delete $CHILDREN{$child};
}
};

# create a shared memory segment for child status
tie(%STATUS,’IPC::Shareable’,SHM_GLUE,
{ create =>1,exclusive=>1,destroy=>1,mode=>0600})
or die “Can’t tie \%STATUS to shared memory: $!”;

# prefork some children
make_new_child() for(1..PREFORK_CHILDREN); # prefork children

#– Main loop
while(!$DONE){
sleep; # sleep until a signal arrives(alarm clock or child)
# get the list of idle children
warn join(‘ ‘,map{“$_=>$STATUS{$_}”} keys %STATUS),”\n” if DEBUG;
unless(%CHILDREN){ last; }
}

warn “Termination received, killing children\n” if DEBUG;
#————-杀掉所有Child Process
kill TERM => keys %CHILDREN;
sleep while %CHILDREN;
warn “Normal termination.\n”;
exit 0;

#—- 给launch_child cleanup child code
sub make_new_child{
die “can’t fork :$!” unless(defined( my $child = fork()));
if($child){ # child>0, so we’re the parent
warn “launching child $child\n” if DEBUG;
$CHILDREN{$child} = 1;
}else{
do_child(); # child handles incoming connections
exit 0; # child is done
}
}
#— 执行accept() loop fro each child —
sub do_child{
my %status;
#–将%status与IPC::Shareable tie在一起
tie(%status,’IPC::Shareable’, SHM_GLUE)
or die “Child $$: can’t tiel \%status to shared memory: $!”;
#—-告知Parent Process,child process 状态已经改变
$status{$$} =’idle’; kill ALRM=>getppid();
for(1..1000000){ }
#—-告知Parent Process,child process 状态已经改变
$status{$$} =’busy’; kill ALRM=>getppid();
#—-告知Parent Process,child process 状态已经改变
for(1..1000000){ }
$status{$$} = ‘done’; kill ALRM=>getppid();
warn “child $$: done\n” if DEBUG;
}
#—- delete the child’s PID from %STATUS.
sub cleanup_child{
my $child=shift;
delete $STATUS{$child};
}     



_________________
欢迎访问:http://www.bang5.com/
谢谢!
呵呵:)
返回页首




中国BBS社区100强评比,支持CU,请再投CU一票,谢谢!
此人为版主 deathcult   性别:帅哥  
版主 – 大天使


大天使
注册时间: 2002-07-22
最后登录: 2004-11-10
帖子总数:
2089
精华帖子: 18
原创精华: 6
来自: www.bang5.com
BLOG主页:
进入
在线状态: …保密…









帖子总数发表于: 2003-06-26 19:06    发表主题: 举报此帖 引用并回复




[4]
為什麼要用IO::Poll?因為使用IO::Select時候,因為其儲存handle是存在。。。。。。
作者:apile

以下資料為本人閱讀Nework Programming With Perl的記要..
有興趣的自己研究研究…

=============================================
date: 2003/06/22

IO::Poll的使用說明:
在5.6版本的時候開始發展,功能完整的版本為0.04版。所以要注意的是IO::Poll版本一定要是0.04以上。

為什麼要用IO::Poll?因為使用IO::Select時候,因為其儲存handle是存在bit vector裡面,因此必須針對所有監控中的Handle一個一個去Scan,找出可以Read/Write的handle。因此在效能的Issue上,當遇到大量的handle需要監控時,就會產生效能上的降低。而IO::Poll的機制則不是這麼回事,他同樣可以監控大量的HANDLE,但是利用array儲存這些handle,因為array的儲存機制,並不同於bit vector,並不需要一個一個去Scan這些handle,所以在效能上比較好。

IO::Poll只需要一個Object就可以處理所有的handle,透過bitmask將Event傳給被監控的Handle,一旦符合需求,可以從handle中取出。

IO::Poll接受的Event(mask):
可讀的
POLLIN:一般與有Priority的資料
POLLRDNORM:一般的資料
POLLRDBAND:有Priority的資料
POLLPRI:特別高的Priority
可寫的
POLLOUT:一般與有Priority的資料
POLLWRNORM:一般的資料
POLLWRBAND:有Priority的資料
有錯誤的
POLLHUP:HangUp發生
POLLNVAL:handle不合法
POLLERR:有Error發生,如果是Socket可用sockopt(SO_ERROR)取得Error內容

IO::Poll的method
1.$poll=IO::Poll->new():產生IP::Poll的Object
2.$mask=$poll->mask($handle,[$mask])
取得或設定目前handle的 event bitsmask,如果mask沒給,則目前的設定值回傳。如果有給mask則將該mask設定給該handle。如果mask為0,則從list將該handle移除。所有的handle預設都會監控(POLLNVAL、POLLERR、POLLHUP)。
3.$poll->remove($handle)
同$poll->mask($handle,0);
4.$events=$poll->poll([$timeout])
等候有任何一個監控中的handle可以被讀取或寫入。回傳Event Type。
5.@handles=$poll->handles([$mask])
取出符合mask的handles。
6.$mask = $poll->events($handle)
取得$handles的所有mask。







代码:

#!/usr/bin/perl
# file : test.pl
# usage: test.pl [host] [port]
# 利用IO::Poll達到多工的技術
#–加載module
use strict;
use IO::Socket;
#–引用後面的constant
use IO::Poll qw( POLLIN POLLOUT POLLERR POLLHUP);
use Errno qw(EWOULDBLOCK);
#–設定Buffer的最大值
use constant MAXBUF =>8192;
#–忽略掉HANG HUP的Signal
$SIG{PIPE} = ‘IGNORE’;
#–設定全域變數,兩個buffer兩個flag
my ( $to_stdout,$to_socket,$stdin_done,$sock_done);
#–取得 host and port
my $host = shift or die “Usage: test.pl host [port]\n”;
my $port = shift || ‘echo’;
#–建立Socket
my $socket = IO::Socket::INET->new(“$host:$port”) or die $@;
my $poll = IO::Poll->new() or die “Can’t create IO::Poll object”;
#–一開始先將STDIN與$socket放入list中,並將其mask設定為POLLIN準備讀取。
$poll->mask(\*STDIN => POLLIN);
$poll->mask($socket => POLLIN);
#–設定標準輸出與$socket為noblocking mode
$socket->blocking(0); # turn off blockingon the socket
STDOUT->blocking(0);  # and on STDOUT
#–main loop,$poll->handles會回傳所有正在監控中的handle
while($poll->handles){
#–等候直到有事件符合
  $poll->poll;
  # 處理可讀取的事件
  for my $handle ($poll->handles(POLLIN|POLLHUP|POLLERR)){
    if($handle eq \*STDIN){
  #?#93;資料讀取表示STDIN已經終止,否則將資料放入to_socket buffer中
    $stdin_done++ unless sysread(STDIN,$to_socket,2048,length $to_socket);
    }
    elsif($handle eq $socket){
  # ?#93;資料讀取表示Socket已經讀取完畢,否則將資料附入to_stdout buffer中
   $sock_done++ unless sysread($socket,$to_stdout,2048,length $to_stdout);
    }
  }

  # 處理可寫入的事件
  for my $handle ($poll->handles(POLLOUT|POLLERR)){
     if($handle eq \*STDOUT){
       my $bytes = syswrite(STDOUT,$to_stdout);
     # 假若不是EWOULDBLOCK,表示真的有Error發生,所以才無法寫入
       unless ($bytes){
          next if $! == EWOULDBLOCK;
          die “write to stdout failed: $!”;
       }
     # 如果發生Partial Write將已經寫出的先清掉。
       substr($to_stdout,0,$bytes) = ”;
     }
     elsif($handle eq $socket){
       my $bytes = syswrite($socket,$to_socket);
       unless ($bytes){
          next if $! == EWOULDBLOCK;
          die “write to socket failed: $!”;
       }
       substr($to_socket,0,$bytes) = ”;
     }
  }
} continue {
  # 每次While loop執行時都會執行到這兒
  # 先設定三個bitmask為0,表示將從list中將該handle移除
  my ($outmask,$inmask,$sockmask) = (0,0,0);
  # 設定stdout的mask,假如有資料要寫出去,則將其mask設為可寫(POLLOUT)
  $outmask = POLLOUT if length $to_stdout > 0;
  # 當 to_socket的資料長度比MAXBUF大、或socket已經完結
  # 或stdin已經完結,都不成立時,則設定STDIN可讀取。
  $inmask = POLLIN unless length $to_socket >= MAXBUF
                      or ($sock_done || $stdin_done);
  # 假如有資料要寫出去,設定$socket為POLLOUT(待寫)
  $sockmask = POLLOUT if length $to_socket>0;
  # 同STDIN定義,但是|=表示附加上去,因為Socket可以同時讀寫
  $sockmask |= POLLIN unless length $to_stdout>=MAXBUF or $sock_done;
  # 設定STDIN、STDOUT、Socket三個handle的bitmask
  $poll->mask(\*STDIN => $inmask);
  $poll->mask(\*STDOUT=> $outmask);
  $poll->mask($socket => $sockmask);
  # 如果$stdin_done為真且已經?#93;有資料送出至$socket了,則將$socket 關?#93;
  $socket->shutdown(1) if $stdin_done and !length($to_socket);
}



_________________
欢迎访问:http://www.bang5.com/
谢谢!
呵呵:)
返回页首




中国BBS社区100强评比,支持CU,请再投CU一票,谢谢!
雨中漫步     
圣骑士


注册时间: 2003-08-29
最后登录: 2004-11-12
帖子总数:
102
精华帖子: 0
原创精华: 0
来自: http://www.perl.cn
BLOG主页:
进入
在线状态: …离线









帖子总数发表于: 2003-09-02 18:09    发表主题: 举报此帖 引用并回复



截取中英文混合字符串,写得很罗嗦,请高人修改一下!
作者:雨中漫步






代码:

sub makelen($$)
  {
     my($sstr,$slen)=@_;
     my $makelen,$parity;
     $mslen=length($sstr);
     if($mslen>$slen)
       {
           for($mn=0;$mn<$slen;$mn++) #在要求的长度内
             {
                $ss=substr($sstr,$mn,1);
                if(ord($ss)<127) #为英文
                  {
                      $parity+=1;
                  }
             }
            if($parity%2==1) #含英文长度为奇数
             {
                if($slen%2==1) #如果所要求的长度也为奇数
                           {
                              $tmpstr=substr($sstr,0,$slen);
                       }
                     else #所要求的长度为偶数
                       {
                          $tmpstr=substr($sstr,0,$slen-1);
                       }
             }
           else #含英文长度为偶数或者为0,0也为偶数
             {
                if($slen%2==1) #如果所要求的长度为奇数
                           {
                              $tmpstr=substr($sstr,0,$slen-1);
                       }
                     else #所要求的长度为偶数
                       {
                          $tmpstr=substr($sstr,0,$slen);
                       }
             }
           $makelen=$tmpstr;
       }
     else
       {
           $makelen=$sstr;
       }
     return $makelen;
  }



_________________
http://www.perl.cn/ #欢迎共同打造perl中国站
http://www.chinabcb.com/ //china c++
返回页首




中国BBS社区100强评比,支持CU,请再投CU一票,谢谢!
slimzhao     
侠客


侠客
注册时间: 2003-09-04
最后登录: 2004-10-25
帖子总数:
23
精华帖子: 0
原创精华: 0


在线状态: …离线









帖子总数发表于: 2003-09-04 13:09    发表主题: 举报此帖 引用并回复



To: 雨中漫步

可以拿下面的代码测试一下:






代码:
$str = “asdf中12 34国人民”;
for(0..length($str) )
{
  print “$_=>”, substring($str, $_), “\$\n”;
}

长度为8, 9时不正确.

看一下这代码怎么样:






代码:
sub substring($$)
{
  my ($str, $len) = @_;
  my $retval = substr($str, 0, $len);
  $retval =~ /[\x7f-\xff]+$/s;
  chop($retval) if (length($&) % 2 == 1);
  return $retval;
}   


返回页首




中国BBS社区100强评比,支持CU,请再投CU一票,谢谢!
lgjut     
圣骑士


注册时间: 2002-12-03
最后登录: 2004-11-18
帖子总数:
140
精华帖子: 0
原创精华: 0


在线状态: …离线









帖子总数发表于: 2003-09-23 22:09    发表主题: 举报此帖 引用并回复



use encoding ‘euc-cn’, STDIN => ‘euc-cn’, STDOUT => ‘euc-cn’;

$str = “asdf中12 34国人民”;
for(0..length($str) )
{
print “$_=>”, substr($str, $_), “\$\n”;
}


返回页首




中国BBS社区100强评比,支持CU,请再投CU一票,谢谢!
雨中漫步     
圣骑士


注册时间: 2003-08-29
最后登录: 2004-11-12
帖子总数:
102
精华帖子: 0
原创精华: 0
来自: http://www.perl.cn
BLOG主页:
进入
在线状态: …离线









帖子总数发表于: 2003-10-26 22:10    发表主题: 举报此帖 引用并回复



获得本机的多个IP地址
本人是初学者,找了半天才找到这种获得多个IP的方法,原来就这么简单 icon_biggrin.gif ,希望能对初学者有所帮助!






代码:

#!c:/perl/bin/perl.exe
use strict;
use Socket;
use Sys::Hostname;

my $host = hostname();
print $host.”\n”;

my $name;
my $aliases;
my $type;
my $len;
my @thisaddr;
($name,$aliases,$type,$len,@thisaddr)=gethostbyname($host);

foreach(@thisaddr)
{
   print inet_ntoa($_).”\n”;
}



_________________
http://www.perl.cn/ #欢迎共同打造perl中国站
http://www.chinabcb.com/ //china c++
返回页首




中国BBS社区100强评比,支持CU,请再投CU一票,谢谢!
y6cmE   性别:帅哥  
新手上路

4
精华帖子: 0
原创精华: 0
来自: xm.fj.cn

在线状态: …离线









帖子总数发表于: 2003-10-27 16:10    发表主题: 举报此帖 引用并回复









代码:

#!e:/635/bin/perl.exe -w
use strict;
#####  Name:      xnnyy.pl
#####  Version:   0.0.0.1
#####  Author:    y6cmE[PerlChina]
#####  Contact:   www.perlchina.org
#####  Updated:   2003-9-21
$|=1;
open(F,”>xnnyy.txt”) or die “Can’t write output file!”;
my $x=shift||3;
my $y=int($x/2);
my @z=(()x$x);
my($e,$v,$n,$m);
for(1..$x*$x){
   if($_ > $x){
      $n=(–$n+$x)%$x;
      $m=(1+$m++)%$x;
      if($z[$n][$m]){
         $n=($n+2)%$x;
         $m=($m-1)%$x;
         $z[$n][$m]=$_;
         print F “$_\t$n\t$m\n”;
      }
      else{
         $n=$n;
         $m=$m;
         $z[$n][$m]=$_;
         print F “$_\t$n\t$m\n”;
      }
   }
   else{
      $n=($x+$e–)%$x;
      $m=(++$v+$y-1)%$x;
      $z[$n][$m]=$_;
      print F “$_\t$n\t$m\n”;
   }
}
close F;
print “Enjoy”;



_________________
The women who are somewhat beautiful, somewhat nice and have some lordliness and thank God are clever are ALWAYS MAINTAIN MANY CANDIDATES!!
返回页首




中国BBS社区100强评比,支持CU,请再投CU一票,谢谢!
ZEWI     
新手上路


注册时间: 2004-08-21
最后登录: 2004-08-23
帖子总数:
4
精华帖子: 0
原创精华: 0


在线状态: …离线









帖子总数发表于: 2004-08-21 17:08    发表主题: 举报此帖 引用并回复



字节码生成器——浅谈PERL源码加密方法
发表于 2004-8-21 16:45:41
文:北京\悟空ZEWI!! (MSN:zengtaocool@msn.com)

众所周知,PERL是一种开源类语言,所以其用做商业软件或者共享软件的前景受到了一定的限制。很多人很羡慕PHP,因为它有ZEND的保护。其实PERL本身的PERLCC,就提供了类似ZEND的功能(运行时需要B::Bytecode模块支持),当然除此之外,它还能作为压缩源码、检查语法等用途。值得注意的是,它是在Perl5.6以后版本中出现的。

我们在WINXP+Apache+PERL5.8的环境下进行操作。假如我们要把一个名为1.pl的文件转换成字节码的perl程序。进入命令行,键入:perlcc -B 1.pl

随后,在工作目录内就生成了一个名为a.exe的文件,操作成功!当然,在运行之前必须要把exe改成原扩展名,否则无法运行,起码在CGI环境下是这样的。

下面来进阶一下,其实还有其他的一些属性可以用。在PERLCC下都是通用的,不光是在字节码生成器中。注意在这里参数的大小写都是非常铭感的,必须严格按照参数大小写格式操作。

-Iinclude directories
操作指定目录内所有文件

-o output file name
指定生成文件名称
-r
生成文件后,立刻运行程序
更多的属性可以参照:http://www.perldoc.com/perl5.8.0/bin/perlcc.html

另外,如果是CGI文件的话,其中的HTML是无法被转换成字节码的,还需要其他软件来辅助进行加密。但是这基本上无关紧要吧?