ldap服务器提供,dn号什么意思?
dn号是Distinguished Name的简称,全称为区分名称。它是一个字符串,用于在LDAP目录服务器中标识一个对象,如用户、组或安全单元。
dn号包含一系列以逗号分隔的属性/值对,每对属性/值对都需要小写形式,并按照RFC 2253进行编码。例如,“cn = John Smith, ou = Sales, dc = example, dc = com”就是一个dn号。
听说好程序员的java技术培训特别难进?
其实并不难进,有的人就以为好的培训机构门槛高,其实门槛高体现在很多方面。比如有的机构就是只招本科学历以上的。
因为他们只教了JAVA。
我常常在我司我部门例行架构师会议上问一个问题:TMD最近又出了什么新技术?
JAVA的世界和别的语言最大的区别就是生态太复杂。在一个JAVA完整生态当中,JAVA语言相关的内容非常少,大约只有三分之一。而大学和培训班教JAVA,80%都围绕JDK开展。这导致大部分没有工作经验的JAVA程序员进了行当以后,常常觉得自己啥都没学过一样。
JAVA语言本身,也就是你在IDE里面写下的代码,大约只占JAVA世界的50%,这还包括了培训班和学校肯定不会教的高级编程技巧,比如更好的代码结构,比如更优的性能,比如更好的扩展性和如何避免过度设计。在学校和培训班,只教一种,把功能做出来。把功能做出来,只占真正的JAVA开发的30%左右。
在代码之上,还有类库的熟悉和选择。还有集成层的选择。这些还都只是在JVM内的东西,加上JVM本身的设置,调优,勉强可以算“JAVA的东西”。当然,还有就是脱胎于JAVA但是目前事实上已经被公认成为独立分支的安卓编程。
在这之上,容器的东西,还可以勉强算上“和JAVA强耦合的东西”,比较大部分JAVA容器比如jboss,WL,WS都是需要相当程度的JAVA相关知识的。
再以外,还存在很多很多内容,可以说,是完全JAVA无关,但是在一个JAVA项目当中是必不可少的部分。比如最重的像是数据库,数据库本身就是一个非常大的知识点,增删改查只是其中最简单容易的部分。还有ESB,或者它的弱化版本integration hub。在云已经成为常识的情况下,容器化技术,serverless技术,以及B/S系统绕不开的用户验证CAS/LDAP技术,都是JAVA项目必须但是和JAVA语言无关的。
综合了以上的内容,你只不过得到了一个“跑得起来”的系统。离真正的生产环境还远。
高可用性,即所谓的HA,也是必不可少的重大知识点,有多复杂?比如我们常常拿来调侃的山歌就能看出其中内容之多:热备,冷备,冷热备,SAN,RAID,磁带机。
安全性,即防御体系也是很重要的。商用服务器还可以通过网络的物理隔离来保护。开放互联网的JAVA项目,必须依靠一系列的安全自动化程序来防御。
在生产环境上,还需要APM的辅助,即application performance monitoring,这些软件从不要钱的,一个月千把美金的,到3年8万美金的都有,其中的部署,监控临界值的设置,错误的应对都是很深的学问。
在这个之外,还有更多的软件工程需要解决的问题,比如协同开发,代码管理,版本发布,自动化测试,渗透测试等等一系列的内容。
这些,基本上大学和培训班都不会教。一是找不到这些领域的专家来教,二是教了你也无法学会。拿武林来打个比方。学校和培训班大约也就是教你一套太祖长拳,其他的各种功夫,你都得在之后的实战里,要么被打得片体鳞伤而学会,要么运气爆表掉下悬崖在Jeff的尸体旁边捡到秘籍
outlook是干什么用的?
1.Outlook是一个免费的电子邮件服务,它将帮助利用强大的整理工具和一套Microsoft应用程序和服务,通过各种设备时刻保持联系。
2.MicrosoftOffice?Outlook是微软办公软件套装的组件之一,它对Windows自带的OutlookExpress的功能进行了扩充。Outlook的功能很多,可以用它来收发电子邮件、管理联系人信息、记日记、安排日程、分配任务。目前最新版为Outlook2013。
3.Outlook是Microsoft的主打邮件传输和协作客户端产品。它是一种集成到MicrosoftOffice和ExchangeServer中的独立应用程序。Outlook还提供与InternetExplorer5.5的交互和集成。电子邮件、日历和联系人管理等功能的完全集成使得Outlook成为许多商业用户眼中完美的客户端。
4.Outlook可帮助查找和组织信息,以便您可以无缝地使用Office应用程序。这有助于您更有效地交流和共享信息。
5.强大的收件箱规则使您可以筛选和组织电子邮件。使用Outlook,可以集成和管理多个电子邮件帐户中的电子邮件、个人日历和组日历、联系人以及任务。
6.当将Outlook与ExchangeServer配合使用时,可以使用工作组信息共享和工作流通讯、组日程安排、公用文件夹、窗体和增强的Internet连接性。
7.Outlook适用于Internet(SMTP、POP3和IMAP4)、ExchangeServer或任何其他基于标准的、支持消息处理应用程序接口(MAPI)的通讯系统(包括语音邮件)。Outlook基于Internet标准,支持目前最重要的电子邮件、新闻和目录标准,包括LDAP、MHTML、NNTP、MIME和S/MIME、vCalendar、vCard、iCalendar,并且完全支持HTML邮件。
8.Outlook还提供与OutlookExpress附带的导入工具相同的导入工具。这使得可以轻松地从其他电子邮件客户端进行迁移,并提供从MicrosoftMail、MicrosoftSchedule+1.0、MicrosoftSchedule+7.0、LotusOrganizer、NetManageECCO、StarfishSideKick、SymantecACT的进一步迁移以及与处于领先地位的个人数字助理(PDA)(如3ComPalmPilot)的同步。
简单通俗一点说?
Microsoft Office Outlook是微软办公软件套装的组件之一,它对Windows自带的Outlook express的功能进行了扩充。Outlook的功能很多,可以用它来收发电子邮件、管理联系人信息、记日记、安排日程、分配任务。目前最新版为Outlook 2019。
微软还将Hotmail在线电子邮件服务更名为Outlook.com。
2018年3月,Android和iOS上的Outlook将集成Cortana,正在内部进行测试。Cortana集成将允许Android和iOS上的Outlook用户利用语音控制功能来朗读消息。此外,用户将能够提问像“我的电子邮件内容 “,以及阅读由Outlook中的特定联系人发送的邮件。
Outlook 使用技巧:
Outlook 的快捷键除了一些 Office 通用的“加粗”、“斜体”、“撤销”等之外,特有的组合键有:
Ctrl+R: 在选中某封邮件时快速回复。
Ctrl+Shift+R: 快速回复所有人。
Alt+W: 转发邮件。
Ctrl+M: 即 F9,发送接收所有目录。
Alt+S: 发送邮件。
Ctrl+G: 跳转到日历的任意一天查看当日/周/月的日程安排。
此外,在 Outlook 初始界面,通过 Ctrl+数字键 可以完成面板间的切换。
在 Outlook 2016 的横置面板中也是如此。
除了这些系统定义的快捷键,用户也可以自定义快捷键。
直接按 Ctrl+V 就会新创建一个邮件,邮件正文即剪贴板里的内容。(当然,如果当前面板是日程面板,Ctrl+V 后就会新建一个约会;如果是联系人面板,Ctrl+V 就会新建一个联系人的便签......)不需要去点击“新建邮件”。不过需要注意的是,黏贴操作只适用纯文本,图片视频内容会丢失。
扩展资料:
Outlook应用范围:
Outlook 是 Microsoft 的主打邮件传输和协作客户端产品。它是一种集成到Microsoft Office和ExchangeServer中的独立应用程序。
Outlook 还提供与Internet Explorer 5.5的交互和集成。电子邮件、日历和联系人管理等功能的完全集成使得 Outlook 成为许多商业用户眼中完美的客户端。
Outlook 可帮助您查找和组织信息,以便您可以无缝地使用 Office 应用程序。这有助于您更有效地交流和共享信息。
强大的收件箱规则使您可以筛选和组织电子邮件。使用 Outlook,您可以集成和管理多个电子邮件帐户中的电子邮件、个人日历和组日历、联系人以及任务。
当您将 Outlook 与 Exchange Server 配合使用时,可以使用工作组信息共享和工作流通讯、组日程安排、公用文件夹、窗体和增强的 Internet 连接性。
Outlook 适用于 Internet(SMTP、POP3和 IMAP4)、Exchange Server或任何其他基于标准的、支持消息处理应用程序接口(MAPI) 的通讯系统(包括语音邮件)。
Outlook 基于 Internet标准,支持目前最重要的电子邮件、新闻和目录标准,包括 LDAP、MHTML、NNTP、MIME 和S/MIME、vCalendar、vCard、iCalendar,并且完全支持 HTML 邮件。
Outlook 还提供与 Outlook Express 附带的导入工具相同的导入工具。这使得可以轻松地从其他电子邮件客户端进行迁移。
并提供从Microsoft Mail、Microsoft Schedule+ 1.0、Microsoft Schedule+ 7.0、LotusOrganizer、NetManage ECCO、Starfish SideKick。
Symantec ACT的进一步迁移以及与处于领先地位的个人数字助理(PDA)(如 3Com Palm Pilot)的同步。
参考资料来源:百科-Outlook
perl的命名规范?
1 命名规则
1.1 文件命名
文件名称统一用英文字母(大小写)、数字和下划线的组合,长度一般不超过20个字符,文件命名体现功能的含义,正式发布版本不能加入作者信息。Perl Scripts 文件的扩展名必须是".pl",Perl Module文件的扩展名必须是".pm"。
正确:
lucent_file_parser.pl
不是:
lucent_file.p
1.2 标识符
采用语法模板来定义标识符的名字,命名必须有一定的实际意义,由英文字母组成,中间可以根据语义的连续性,使用下划线连接。
1.2.1 变量
局部变量必须由小写字母和下划线组成,常量名必须由大写字母和下划线组成。由多个单词组成的名字里,使用下划线"_"把多个单词分开。全局变量以’g_’开头,其余部分的命名规则和局部变量相同。每个全局变量必须有注释说明其作用。
正确:
my $next_node;
不是:
my $node;
1.2.2 包和类
包、类的命名采用大小写混合、首字母大写的方法。
正确:
IO::Controller
1.2.3 标识符缩写
标识符缩写时要保留单词的开始字母,不是辅音字母的简写。
正确:
use List::Util qw( max );
DESC:
for my $desc (@orig_strs) {
my $len = length($desc);
next DESC if ($len > $UPPER_LIM);
$max_len = max($max_len, $len);
}
不是:
use List::Util qw( max );
DSCN:
for my $dscn (@rgnl_strgs) {
my $lngh = length $dscn;
next DSCN if $lngh > $UPPR_LMT;
$mx_lngh = max($mx_lngh, $lngh);
}
1.2.4 函数
由小写字母、下划线组成。
正确:
sub max
{
……
}
sub get_msc_name
{
……
}
不是:
sub getMscName
{
……
}
1.3 布尔类型
boolean类型的变量,或返回boolean类型的值的函数,在命名时要反映其属性,必须用is或者has开头。
正确:
sub is_valid;
sub is_metadata_available_for;
sub has_end_tag;
my $has_loading_finished;
my $has_found_bad_record;
# and later...
if (is_valid($next_record) && !$has_loading_finished) {
METADATA:
while (is_metadata_available_for($next_record)) {
push @metadata, get_metadata_for($next_record);
last METADATA if (has_end_tag($next_record));
}
}
else {
$has_found_bad_record = 1;
}
1.4 数组和哈希
数组类型的变量采用复数,hash类型的变量采用单数。要用undef显式释放变量空间。
正确:
my %option;
my %title_of;
my %count_for;
my %is_available;
# and later...
if ($option{'count_all'} && $title_of{$next_book} =~ m/$target/xms) {
$count_for{$next_book}++;
$is_available{$next_book} = 1;
}
my @events;
my @handlers;
my @unknowns;
# and later...
for my $event (@events) {
push @unknowns, grep { ! $_->handle($event) } @handlers;
}
print map { $_->err_msg } @unknowns;
2 注释
所有注释可用英文或中文书写,尽量使用英文注释。保持注释和代码的完全一致,修改程序时,必须修改相应的注释。注释的行数一般应在程序总行数的1/5到1/3。禁止出现错别字。注释应该语义明确,避免出现二义性。
2.1 文件头部注释
每个含有源代码的文件必须在文件开始有关于该文件的介绍性注释。其中列出文件名、创建者、创建日期、功能描述、版本信息、版权声明;如果对文件进行了修改,应该在文件头中说明修改人、修改日期、修改原因,并变更文件的版本信息,最新版本信息放到最前面。
格式为:
#*********************************************************
# FileName: lucent_file_parser.pl
# Creator: Phonix <phonix@gmail.com.cn>
# Create Time: 2006-01-09
# Description: This is the proof-of-concept code for the
# Windows denial-of-serice attack described by
# the Razor team (NTBugtraq, 19-May-00).
# CopyRight: Copyright © Bright Ocean Inter-Telecomm,All rights reserved.
# Revision: V1.0.0
# ModifyList:
# Revision: V1.1.1
# Modifier: Phonix
# ModifyTime: 2006-01-17
# ModifyReason: fix the bug of ……
#
# Revision: V1.1.0
# Modifier: Phonix
# ModifyTime: 2006-01-16
# ModifyReason: add mysql&oracle db support
#*********************************************************
不是简单的:
#========================================
#Created By:Phonix
#Created Time: 2006-01-09
#Modified Time: 2006-01-17
#========================================
2.2 文件中注释
建议在文件中标识出修改部分的起止位置。
正确:
# add mysql&oracle db support begin
……
# add mysql&oracle db support end
2.3 函数注释
在每个函数前必须写描述性注释。说明这个函数的功能、参数和函数的返回值。
格式为:
#*******************************************************************
# Function Name: calc_time($datetime, $delta)
# Description: This function calculate the new datetime.
# Parameters:
# 1. $datetime is the base time, taking the format of 'yyyy-mm-dd hh:mm:ss'
# 2. $delta is the time which should be add to the $datetime. A positive value increase the time
# while the negative vale decrease the time
# Return:
# A new time string is returned, also taking the format of 'yyyy-mm-dd hh:mm:ss'
#*********************************************************************
不是简单的:
##########################################
#function name : get_ldap
#desc : get config info from ldap server
##########################################
2.4 程序块注释
程序块注释用于说明程序中的关键算法、使用某种技巧的代码以及修改、测试、阅读时必须加以注意的代码。
格式为:
#*********************************************************************
#注释内容
#......
#......
#********************************************************************
2.5 语句注释
用于对特定程序语句进行说明,建议采取在语句行末尾说明的方法,同时注释换行后也要对齐。格式为:
my @names = (
'Damian', # Primary key
# the key is
'Matthew', # Disambiguator
'Conway', # General class or category
);
3 代码布局
3.1 括号
建议括号、插入语可以采用两种方式之一,但是在一个程序里选定那种方式之后,那么要至始至终保持一致。
3.1.1 方式一
采用K&R风格。
格式为:
my @names = (
'Damian', # Primary key
'Matthew', # Disambiguator
'Conway', # General class or category
);
for my $name (@names) {
for my $word ( anagrams_of(lc $name) ) {
print "$word\n";
}
}
3.1.2 方式二
括号对{}对必须位于同一列,独占一行,并且和{}之外的语句行对齐
my @names =
(
'Damian', # Primary key
'Matthew', # Disambiguator
'Conway', # General class or category
);
for my $name (@names)
{
for my $word (anagrams_of(lc $name))
{
print "$word\n";
}
}
3.2 关键字
把关键字和其他的内容分开,关键字if, while, for,else…后面必须接一个空格。if和while语句必须使用’{‘和’}’括起语句体,即使只有一行代码。建议不使用单行的if语句。
正确:
for my $result (@results) {
print_sep( );
print $result;
}
while ($min < $max) {
my $try = ($max - $min) / 2;
if ($value[$try] < $target) {
$max = $try;
}
else {
$min = $try;
}
}
if ($condition){
$i++;
}
不是:
for(@results) {
print_sep( );
print;
}
while($min < $max) {
my $try = ($max - $min) / 2;
if($value[$try] < $target) {
$max = $try;
}
else{
$min = $try;
}
}
if($condition) {$i++;}
3.3 子程序和变量
不要把子程序或变量和其后的括号部分分开。
正确:
my @candidates = get_candidates($marker);
CANDIDATE:
for my $i (0..$#candidates) {
next CANDIDATE if open_region($i);
$candidates[$i]
= $incumbent{ $candidates[$i]{region} };
}
不是:
my @candidates = get_candidates ($marker);
CANDIDATE:
for my $i (0..$#candidates) {
next CANDIDATE if open_region ($i);
$candidates [$i]
= $incumbent {$candidates [$i] {region}};
}
3.4 代码缩排
缩进采用四个空格,或一个TAB(1 TAB 设置成四个空格)。
3.5 代码块
不要把两句话放在一行,每行只能写一个语句。
正确:
while (my $record = <$inventory_file>) {
chomp $record;
next RECORD if $record eq $EMPTY_STR;
my @fields = split $FIELD_SEPARATOR, $record;
update_sales(\@fields);
$count++;
}
不是:
while (my $record = <$inventory_file>) {
chomp $record; next RECORD if $record eq $EMPTY_STR;
my @fields = split $FIELD_SEPARATOR, $record; update_sales(\@fields);$count++;
}
3.6 代码长度
每个函数体的语句行不能超过100行(不包括注释,一个分号算一行)。每行长度不要超过78个字符,超过该长度时,必须考虑换行,从低优先级的操作符处分割长表达式, 在赋值符前断开长的语句。
正确:
push (@steps, $steps[-1]
+ $radial_velocity * $elapsed_time
+ $orbital_velocity * ($phase + $phase_shift)
- $DRAG_COEFF * $altitude);
$predicted_val = $average + $predicted_change * $fudge_factor;
不是:
push (@steps, $steps[-1] + $radial_velocity
* $elapsed_time + $orbital_velocity
* ($phase + $phase_shift) - $DRAG_COEFF
* $altitude);
$predicted_val = $average
+ $predicted_change * $fudge_factor;
3.7 操作符
二元运算符(算术运算符, 赋值运算符等)的两边都要接空格,低级操作符(如:+-)两边各有两个空格,高级操作符(如:*%)两边各有一个空格。
在运算符'->'两边不要使用空格,在一元操作符和操作数两边不要使用空格。
可以使用括号来表示运算的先后顺序。
正确:
my $displacement
= $initial_velocity * $time + 0.5 * $acceleration * $time**2;
my $price
= $coupon_paid * $exp_rate + ($face_val + $coupon_paid) * $exp_rate**2;
不是:
my $displacement=$initial_velocity*$time+0.5*$acceleration*$time**2;
my $price=$coupon_paid*$exp_rate+(($face_val+$coupon_val)*$exp_rate**2);
3.8 语句结束符
在每个语句后边要填加分号。
正确:
while (my $line = <>) {
chomp $line;
if ( $line =~ s{\A (\s*) -- (.*)}{$1#$2}xms ) {
push @comments, $2;
}
print $line;
}
3.9 代码排列
数组或Hash的赋值采用垂直排列。
正确:
my @months = qw(
January February March
April May June
July August September
October November December
);
my %expansion_of = (
q{it's} => q{it is},
q{we're} => q{we are},
q{didn't} => q{did not},
q{must've} => q{must have},
q{I'll} => q{I will},
);
不是:
my @months = qw(
January February March April May June July August September
October November December
);
my %expansion_of = (
q{it's} => q{it is}, q{we're} => q{we are}, q{didn't} => q{did not},
q{must've} => q{must have}, q{I'll} => q{I will},
);
3.10 非末端表达式
采用中间变量代替长表达式。
正确:
my $next_step = $steps[-1]
+ $radial_velocity * $elapsed_time
+ $orbital_velocity * ($phase + $phase_shift)
- $DRAG_COEFF * $altitude
;
add_step( \@steps, $next_step, $elapsed_time);
不是:
add_step( \@steps, $steps[-1]
+ $radial_velocity * $elapsed_time
+ $orbital_velocity * ($phase + $phase_shift)
- $DRAG_COEFF * $altitude
, $elapsed_time);
3.11 功能块顺序
在每个Perl Scripts中,每个功能块之间必须有一个空行。主程序为main()函数,功能块出现顺序如下:
use modules;
global variable 定义
main定义
sub routine 定义
4 数值和表达式
4.1 字符串界定符
需要用变量替换的字符串用双引号,否则用单引号。
正确:
my $spam_name = "$title $first_name $surname";
my $pay_rate = "$minimal for maximal work";
my $spam_name = 'Dr Lawrence Mwalle';
my $pay_rate = '$minimal for maximal work';
4.2 常量
使用字符常量,而不要直接用数值。
正确:
use Readonly;
Readonly my $MOLYBDENUM_ATOMIC_NUMBER => 42;
# and later...
print $count * $MOLYBDENUM_ATOMIC_NUMBER;
不是:
print $count * 42;
4.3 字符串
4.3.1 两行
对于两行的字符串,要用“.”进行连接。
正确:
$usage = "Usage: $0 <file> [-full]\n"
. "(Use -full option for full dump)\n";
不是:
$usage = "Usage: $0 <file> [-full]
(Use -full option for full dump)";
4.3.2 多于两行
对于多于两行,要采用如下格式:
正确:
$usage = <<"END_USAGE";
Usage: $0 <file> [-full] [-o] [-beans]
Options:
-full : produce a full dump
-o : dump in octal
-beans : source is Java
END_USAGE
不是:
$usage = "Usage: $0 <file> [-full] [-o] [-beans]\n"
. "Options:\n"
. " -full : produce a full dump\n"
. " -o : dump in octal\n"
. " -beans : source is Java\n"
;
4.4 哈希变量
Hash变量的定义采用双箭头(=>)方式。
正确:
%default_service_record = (
name=> '<unknown>',
rank=> 'Recruit',
serial=> undef,
unit=> ['Training platoon'],
duty=> ['Basic training'],
);
不是:
%default_service_record = (
'name', '<unknown>',
'rank', 'Recruit',
'serial', undef,
'unit', ['Training platoon'],
'duty', ['Basic training'],
);
5 函数
5.1 调用语法
调用时要使用圆括号,不管是否有参数。
正确:
fix();
coerce($input, $INTEGER, $ROUND_ZERO);
不是:
fix;
5.2 函数返回
在函数中要进行显式的return返回。
正确:
sub set_terseness {
my ($terseness) = @_;
my $default_terseness = $terseness;
return; # Explicitly return nothing meaningful
}
不是:
sub set_terseness {
my ($terseness) = @_;
my $default_terseness = $terseness;
}
6 编程惯例
6.1 使用use strict
所有Perl Scripts 文件中必须在开始使用“use strict;”,进行严格的语法检查,便于查找错误。
6.2 避免使用内部变量名称
避免使用Perl内部变量。使用“use English;”装入Perl内部变量的符号名称。使用my来限定变量的作用域。下面是一些Perl内部变量名称的对应关系。
$_ $ARG
@_ @ARG
$! $ERRNO
$? $CHILD_ERROR
$$ $PID
$0 $PROGRAM_NAME
$. $INPUT_LINE_NUMBER
$| $OUTPUT_AUTOFLUSH
$@ $EVEL_ERROR
$& $MATCH
$` $PREMATCH
$' $POSTMATCH
$+ $LAST_PAREN_MATCH
$/ $RS
$\ $ORS
$< $UID
$> $EUID
$( $GID
$) $EGID
$] $PERL_VERSION
$? $CHILD_ERROR
6.3 避免使用goto
避免使用goto语句(只有在从多重循环的内部跳出时才可以使用)。除非能够特别有效的增加程序的效率并且不影响程序良好结构的特殊情况。
6.4 语法检查(辅助工具)
使用-cw选项检查Perl程序的语法。
正确:
perl -cw -Mdiagnostics file.pl # check syntax with warnings on
nt; # Perl 5.004_04, define constants
use Env; # instead of $ENV{'HOME'}; Shortens the usage, but do not
# mix normal variables
# with environment variables.
6.5 use Carp; # For modules: 使用标准模块
尽量使用标准库函数、公共函数和开发库中已有的函数和模块,使用FileHandle模块来处理文件的读写。尽量使用以下的标准Perl模块:
use strict; # helps you to locate syntax errors or uncertainties.
use integer; # if you don't need floating point math,it will speed Perl up.
use constagives you `carp' and `croak'
use English; # gives symbolic names, like $! ==> $ERRNO
use Getopt::Long; # --posix command line option handling
use Cwd; # platform independent cwd()
use File::Basename; # don't invent your own wheel of this.
use File::Find; # don't use system("find . -name ...")...
use File::copy; # don't use system("cp this that");
use File::patch; # instead of system("mkdir");
use File::stat; # readable: $st = stat($file), $st->mode
use DirHandle; # OO form of `readdir'
use Text::Tabs # un/expand tabs in text
use Text::ParseWords; # Parse text into tokens, understands embedded
# quotes. @a = "ewords("[ +]", 0, $_);
# a+b, "a b" + c
use Socket; # socket handling
use Sys::Hostname; # don't invent your own wheel
use Net::Ping # unix ping, check if host is online
use Time::Local # time manipulations
6.6 其他
1、编码、测试、注释,是程序员的三项基本工作,它们是同等重要的。
2、可靠性第一,可读性第二,效率第三。只有在极个别必须强调效率的部分,可以是可靠性第一,效率第二,可读性第三。
3、首先是正确,其次是优美。
4、无法证明你的程序没有错误。因此,在新编写完一段程序后,应该测试通过后再继续编码。
5、改正一个错误的同时,可能会引起新的错误。因此,在修改bug前,首先考虑对其他程序的影响。修改后,应该对程序进行完整的测试,而不是只对修改部分进行测试。
6、避免使用很多个参数的函数。
7、函数应该只有一个出口。
8、循环应该只有一个出口,避免多个出口。
9、尽量避免使用全局变量。
10、在尽可能小的作用域内定义和使用变量。
11、使用括号,表达复杂表达式中的操作符的优先顺序。
12、循环、分支不要超过五个层次。
13、循环、分支等语句后,即使只有一行代码时,也要使用{}将其括起来。
14、禁止else goto和else return。
15、重复使用的、完成相对独立功能的算法、代码,应该抽象为公共模块。