西雅图之旅
波音飞机厂(Boeing Factory)
官方网站:http://www.boeing.com/
地址:3003 W Casino Rd,Everett, WA
波音飞机厂是世界最大的飞机制造厂,位于西雅图近郊 Everett,在 Highway 5 出口 (EX.189)。从西雅图开车约 40分钟.由温哥华开车约两小时到达。
游客进入波音飞机厂后会看两部影片(1.飞机历史 2.在7分钟快速拼出飞机 (Qick Put Together)),之后有专业解说员带领乘车围著占地 365 公顷,有 36 个足球馆那么大的厂区游览,途中将参观巨大无比的机棚、试验跑道和一个看上去比超级体育馆还大的喷漆车间。
波音飞机厂的厂房给游客极大视觉上的震撼,它的厂房一排有六扇大门,每个高25米,宽107米,相当于一个美式足球场大小,人和车在它的面前都显得非常渺小。这个总面积400万平方米的厂房被记入了吉尼斯世界大全,至今没有被打破。由于面积太大,工人在里面穿行时,不少人以自行车或三轮车代步。厂房里回响著机器转动的嘈杂声,隐隐约约还能听到从下面的工作站里传来爵士乐的节奏声。穿著 T 恤衫、身材魁梧的机械师们嘴里说著“让一让”之类的话,骑著公司发给的三轮车穿过有巨大无比的车间,看上去就像小小的蚂蚁一样。
波音飞机厂每年要接待将近 10 万名参观者,沿途都设有固定的导游,用非常有趣的滑稽表演做介绍(“记住,伙计们,不是波音飞机我不坐!”)。同时游客还会了解到一些惊人的细节,并懂得如何区别波音 777 和波音 767等。波音飞机厂之旅不仅给每一位游客留下深刻的印象,同时还将使大家增长不少知识,扩大视野,非常值得一游。
如果自己参加波音飞机厂的旅行注意要提前预约,可以通过以下网址在波音飞机厂的网站上提前预约:http://www.boeing.com/companyoffices/aboutus/tours/。另外注意不要将波音飞机厂与Seattle南面的航空博物馆(Museum of Flight) 混淆。
西 雅 图 中 心 Seattle Center
此 中 心 为 1962年 西 雅 图 万 国 博 览 会 的 会 址 , 终 年 娱 乐 不 间 断 , 提 供 购 物 、 餐 饮 , 以 及 艺 术 、 教 育 、 文 化 等 活 动 。 内 部 游 乐 景 点 包 括 太 空 针 塔 、 太 平 洋 科 学 中 心 、 儿 童 馆 及 各 国 食 品 展 示 场 (Food Circus), 此 外 , 西 雅 图 观 光 局 办 事 处 并 在 该 中 心 内 提 供 谘 询 服 务 。
地址 : 2002 2nd Ave., N., Seattle.
交通 : 西 湖 购 物 中 心 (400 Pine St.)四 楼 顶 楼 搭 乘 单 轨 电 车 。
电话: (206)684-7600
太 空 针 塔 Space Needle
塔 高 180公 尺 , 是 西 雅 图 最 显 着 的 地 标 。 游 客 可 登 上 观 景 台 , 三 百 六 十 度 浏 览 西 雅 图 全 貌 , 或 至 两 家 餐 厅 The Space Needle及 The Emerald Suite品 尝 鲜 美 海 鲜 大 餐 , 亦 可 在 一 楼 纪 念 品 店 选 购 此 地 特 有 的 艺 品 。
电话: (206)443-2100
票价 : 大 人 5.5美 元 , 5-12岁 免 费 。用 餐 客 人 免 费 , 但 如 只 利 用 酒 吧 则 要 收 费 。
大 学 区 University District
此 区 类 似 台 北 的 公 馆 , 书 店 、 餐 厅 、 服 饰 店 沿 University Way林 立 , 兼 有 戏 院 与 艺 品 店 。 华 盛 顿 大 学 是 美 国 西 部 最 大 的 公 立 大 学 , 占 地 约 2.4平 方 公 里 , 校 区 建 筑 物 超 过 一 百 座 以 上 , 包 括 亨 利 美 术 馆 、 州 立 博 物 馆 、 竺 朗 海 喷 泉 及 爱 斯 基 摩 大 体 育 场 等 。
地 : 环 绕 华 盛 顿 大 学 , 在 州 际 公 路 1-5之 东 。
Woodland Park Zoo
名 列 为 全 国 十 大 动 物 园 之 一 , 有 近 300种 野 生 动 物 , 园 内 动 物 都 居 住 在 模 拟 自 然 生 态 的 环 境 中 , 规 划 有 亚 洲 象 森 林 区 、 本 地 难 得 一 见 的 热 带 雨 林 区 等 。
地址 : 5500 Phinney Ave., North, Seattle
电话 : (206)684-4800
交通 : 在 3rd Ave.及 Pine St.N.55TH St. N.55TH St.& Phinney Ave. N.下 车
时间 : 三 月 十 五 日 ~ 十 月 三 十 日 09:30-18:00, 十 月 三 十 一 日 ~ 三 月 十 四 日 09:30-16:00。
派 克 地 市 场 Pike Place Market
是 美 国 着 名 的 农 产 品 市 集 , 有 二 百 多 家 商 店 , 供 应 各 类 生 鲜 蔬 果 , 以 及 各 地 风 俗 的 手 工 艺 品 ; 另 外 充 满 异 国 情 调 的 餐 厅 , 亦 沿 街 林 立 。 市 场 内 洋 溢 一 片 热 闹 蓬 勃 的 气 氛 , 是 西 雅 图 当 地 居 民 及 游 客 最 喜 爱 的 地 方 。
地址 : 位 于 Alaskan Way Vinduct, Ist St.,Lenora &Union Aves.之 间 。
==========================
海岸码头区The Waterfront
从派克市场的Pike Hillclimb (Pier 59对面)或者从University Street上的Harbor Steps(Pier 56对面)沿着台阶走下来,跨过马路就来到了海边的码头区。这是一个非常繁忙的码头区,共有20多个码头,从Pier 48一直到Pier 70,许多国际渡轮,华盛顿州的交通渡轮以及各种观光渡轮都从这里进出。其中从54号到59号码头是以观光和休闲旅游为主的,水族馆,立体电影院,海鲜餐厅,礼品店等都设在这些码头上。
Ye Olde Curiosity Shop(Pier 54)
这是一家有着超过百年历史的工艺品店,店里有不少该店创始人Mr.Joe Standley收藏的各种不同风格的古董和稀奇古怪的物品。这家店是码头区一带最有名的工艺品店,虽然名气大,但价位平实,且种类繁多,挑选范围大,如果想要买一些富有地方特色的纪念品,这家百年老店绝对是首选。
Ivar's Acres of Clams(Pier 54)
这是一家非常有名的海鲜餐厅。来到码头区,自然要品尝一下这里的海鲜,尤其是地道的美味海鲜浓汤Chowder,那才是不虚此行。Chowder大致可分为白色的Cream Chowder和红色的Chowder两种,一般菜单上Chowder都会注明是White还是Red.两种Chowder的主料都是马铃薯,鲜奶油和洋葱,并加上新鲜的鱼肉,蛤肉,蚌肉,牡蛎,蟹,虾,以及切碎的培根,芹菜,胡萝卜或其它蔬菜,还有一些面粉烹煮而成,因此汤非常的浓绸且营养丰富。红色 Chowder则在此基础上再加上一些番茄和番茄酱,味道有些酸甜,这是华盛顿州的特有风味。由于各家餐厅Chowder的配料和调料都不一样,每家餐厅均有其自己特有的招牌Chowder。而一年一度的西雅图海洋节(Seattle Maritime Festival)还要举行Chowder大赛呢,每个参加活动的游客都有投票权。Ivar's最著名的Chowder是Smoked Salmon Chowder,白色的浓汤非常鲜美,不愧是其招牌Chowder.码头区的海鲜餐厅因为都有无敌的view,所以价格比普通餐厅都要贵上二至三成,但不少餐厅都提供外卖的吧台,例如这家Ivar's餐厅就是其中之一。你可以买一份海鲜套餐(Oyster&Chips,Prawn&Chips,etc $5.49),再点一杯Chowder($2.95),然后坐在露天的长椅上享受美味的海鲜,吹着清凉的海风,也是挺不错的。这里的海鲜无论是清蒸的蛤,还是油炸的牡蛎,扇贝或鱼排都非常的美味,我想这可那是原料极其新鲜的缘故吧,总之点菜时无论点那一种都不会点错,尽管放心品尝美食好了。
Pier 55,56
这两个码头是Argosy Cruise公司所有观光渡轮出发的码头,包括去Blake Island上地Tillicum Village(印地安文化村)的渡轮也从这里出发,行程为4小时,包括往返航程,三文鱼大餐,原著民舞蹈欣赏及岛上漫步。其它观光渡轮包括1小时或2小时的Elliott Bay环游,可以从海上眺望如海市蜃楼般崛起的西雅图Downtown以及奥林匹克群山Olympic Mountain Ranges.
Bay Pavilion(Pier 57)
这家位于57号码头上的室内游乐场是最受小朋友们欢迎的小型乐园,里面有各种电动游戏和漂亮的旋转木马,另外冰淇淋和热狗等美式小吃也样样俱全,其中尤以冰淇淋店提供的二十多种不同口味的冰淇淋最受欢迎。当然这里也有餐厅和工艺品店,其中Pirate's Plunder Souvenirs店专卖一些海盗船或与航海相关的纪念品和手工艺品,蛮特别的,值得逛一逛。
The Seattle Aquarium(Pier 59)
西雅图水族馆就位于59号码头上,它于立体电影院Imax-Dome Theater 连在一起。水族馆内展出各种鱼类及海洋哺乳类动物,种类繁多,令人目不暇接,尤其是那些五颜六色,奇形怪状的鱼类真是薇为奇观。水族馆最特别之处是它有一个巨大的球形透明玻璃视窗,人站在中央可以抬头或四面观看海水中的那些自然生态,另外水族馆还是世界上唯一展示三文鱼繁殖过程的水族馆,馆内有一个专供三文鱼回流的鱼梯。水族馆还开发出人工养殖海獭的技术,在户外的水池中还可以看到正在享受日光浴的海狮。
Odyssey Maritime Discovery Center(Pier 66)
这是美国西北地区唯一的一座海事博物馆,馆藏极为丰富,馆内共分为4大区和44个展览厅,里面展示了许多和海上贸易及渔业相关的内容,并且介绍海湾居民生活的环境特色,还有独木舟的实际操作等,非常祥实地呈现了海洋与人类生活息息相关的重要性以及海湾的生态环境。
===========================
华盛顿湖Lake Washington
西雅图是一个被山水环抱的城市,即使在热闹繁华的市区,不仅能享受到迷人的海滨风光,还能欣赏到美丽的湖光山色。华盛顿湖因为面积广阔,感觉就象是一个海。沿着蜿蜒狭长的Lake Washington Blvd在湖边一直开,会经过好几个公园,例如Denny Blaine Park, Madrona Park, Leschi Park和Colman Park.这些公园有不少绿茵茵的草坪,小型的儿童游乐场,专用的单车道,因此不仅是欣赏漂亮的华盛顿湖的好地方,也是当地居民进行户外休闲活动的绝佳场所。湖边有不少的游艇码头,夏日一到,各种水上活动都会在湖面上展开。
沿着湖边有许多造型别致的住宅,其中不乏豪华别墅,比尔盖茨新建的千万豪宅就位于华盛顿湖畔。华盛顿湖与联合湖畔一样有许多各式各样的船屋Houseboat,这些水上人家的屋子多半都是木造的,有整排公寓式的,也有独栋豪华级的,不少都有私人游艇码头停靠着自己的游艇。
沿着520号高速公路一直朝东面开,很快就会经过华盛顿湖上有名的浮桥Evergreen Point Floating Bridge。大桥虽是钢筋水泥建筑,但没有桥墩,整个桥浮在华盛顿湖的湖面上。浮桥的两端各有一个小小的下坡,当车子从高处往下开时,感觉眼前突然豁然开朗起来,湛蓝的湖水,波光嶙嶙的湖面尽收眼底,而对面在晴空映衬下显得更加雄伟的雪山似乎近在咫尺,这海(湖)天一色的美景实在令人震撼。随着车子在桥上高速奔驰,心也在随之飞腾,真希望这浮桥没有尽头,那样就可以尽情享受这难得的人间美景了。
=============================
SEATTLE PREMIUM OUTLET
SEATTLE PREMIUM OUTLET,可在逾百个名牌店购物。
================================
西雅图的另类走法-美丽的海天景致(亦工原创) 打印 E-mail
跳转
西雅图的另类走法-美丽的海天景致(亦工原创)
页面 2
页面 1 / 2
西雅图去过多次,都是沿着5号公路走,比较单调。这次另辟途径,感觉比5号公路好很多。
过边境后沿5号公路到Bellingham,在250出口拐出,然后上11号公路(Chuckanut Dr.),沿着海岸线走,边走边观赏海景。Chuckanut Dr比之BC的Sea-to-Sky Highway在气势上要小,但沿路停车较为方便,有很多观景点。
====================
标题 English Name 点击
太空针塔 Space Needle 7455
西雅图中心 Seattle Center 7149
先锋广场 Pioneer Square 4701
西雅图渔人码头 The Waterfront 6287
华盛顿大学 The University of Washington 5163
华盛顿湖运河与区腾登水闸 Lake Washington Ship Canal & Hiram M. Chittenden Government 4257
波音飞机厂 Boeing Factory 7187
卢高美瀑布 Snoqualmie Fall 5002
西雅图地图 (请点击地图上的标记查看具体景点信息)
1.
来到Seattle Center,最不能错过的当然就是现在西雅图的象征-太空针塔了。太空针塔的高度是605英尺,在距离地面520英尺处是观景台和旋转餐厅。搭乘透明电梯从地面到观景台只需40秒钟,登上观景台可以俯瞰西雅图360度的全景,包括Mt.Rainier, Puget Sound和漂亮的湖泊等尽收眼底。人们常说到西雅图没有到过太空针塔,就象到巴黎没有到过埃菲尔铁塔一样,这使得太空针塔成为西雅图最热门的旅游景点之一。
2.
Seattle Center占地74英亩,是西雅图1962年举办世界博览会的地方,当时这个盛大的国际活动以'迎向21世纪'为展览主题,吸引了近1000万人次的参观群众。虽然博览会已经是四十多年前的事情了,但当初的各种展览场所与博物馆已经被改建成不同用途的集科教与娱乐为一体的各种设施,成为西雅图的文化中心。
3,
从派克市场的Pike Hillclimb (Pier 59对面)或者从University Street上的Harbor Steps(Pier 56对面)沿着台阶走下来,跨过马路就来到了海边的渔人码头区。这是一个非常繁忙的码头区,共有20多个码头,从Pier 48一直到Pier 70,许多国际渡轮,华盛顿州的交通渡轮以及各种观光渡轮都从这里进出。其中从54号到59号码头是以观光和休闲旅游为主的,水族馆,立体电影院,海鲜餐厅,礼品店等都设在这些码头上。
4
华盛顿大学占地极为广阔,其地理位置非常好,不仅濒临Portage Bay和Union Bay,面对着广阔如海的华盛顿湖,而距离市中心也只有15分钟的车程。
华盛顿大学的正门有几个高大的图腾柱,这是华盛顿大学的特有景致,也是美国西北部原著民的特有象征。华盛顿大学被称为拥有全美最漂亮的校舍,一走进大学,立刻就会为那一栋栋美轮美奂的欧式建筑所倾倒,就象是置身于欧洲的某一个城市一样。在这里不仅能看到歌德式尖顶造型的建筑,还有有着巴洛克式华丽装饰风格的大楼,有的气派宏伟,有的精致典雅,但无不透露着浓厚的古典气息。
5,
介
长达8哩的华盛顿湖运河是连接西雅图附近主要湖泊及港湾的信道,运河连接普杰特湾与华盛顿湖。区腾登水闸的主要功用在于以水闸升降的方式调节水位以利远洋轮船进入淡水湖。每年约有100,000辆的船只通过此运河,现在不仅是交通要道更是全家出游的好处所。每年十月鲑鱼回到此地产卵,顺着鱼梯跳跃的奇观,总吸引许多游客前来观赏。湖上有二座浮桥(520公里)是世界上最长 、没有桥墩的浮桥,主要连接西雅图与新兴城市 Bellevue。
6
卢高美瀑布(Snoqualmie Fall)距离西雅图仅25英里,是华盛顿州著名的自然景观之一。瀑布每年吸引150万人前来游览,尤其在春夏,慕名前来观赏瀑布的游客络绎不绝。该瀑布高达二百七十尺,虽然没有尼亚加拉瀑布那么气势磅礴,但比尼亚加拉瀑布还要高出一百尺,因而景象也颇为壮观。
卢高美瀑布方圆两英亩都被开辟作公园,从公园内的停车场下车,经过一段小小的天桥时,即可到达瀑布。走在天桥上,虽未看见瀑布,却已经能听到轰隆隆的水声,并感到空中弥漫的水气袭面而来。走不远,即到达专门建造的观景亭。观景亭建在瀑布对面的山上,位于Snoqualmie River上空300英尺处,在这里可以清楚地欣赏到壮观的瀑布。瀑布从悬崖顶端凌空飞流而下,倾入底下的幽谷中,势如翻江倒海,同时发出震天巨响。急速直下的水流在幽谷中溅起一片水雾,在阳光照射下,水雾又化作道道彩虹,奇妙而美丽。从近三百英尺高空垂直飞泻而下的瀑布真让游人产生"疑是银河落九天"的幻觉。
Thursday, May 7, 2009
Monday, May 4, 2009
chap 2 TCL-Introduction and Overview
Expression:
set x "the answer is 1 + 3"
set y "the answer is [1 + 3]" ; #wrong, 1 is not a command
set y "the answer is [expr 1 + 3]"
=====================
Source command:
source ~/def.tcl; #if the file include the procedure, it is callable.
=====================
file I/O
set file [open /tmp/stuff w]
puts -nonewline $file "Hello World"
++++++++++++++++++++++++++++++++++++++
Chap 3 Getting started with Expect
Once expect has matched data to a pattern, it moves the data to the expect_out array.
the matched data is no longer eligible to be matched.
set timeout 60; #by default, expect only wait for 10 sec
=======================
interact command
Expect provides a command that turn control from the script over to u.
++++++++++++++++++++++++++++++++++++++++++
Chap 4 Glob patterns and other Basic
Wednesday, March 25, 2009
Tuesday, March 24, 2009
Thursday, March 19, 2009
Sample for MultiSpawn
#!/usr/bin/expect --
set timeout 3600
set username admin
set password ""
set h3600 7
set l3600 2
log_user 1
proc clear_line {line} {
spawn telnet 172.18.9.29
expect "#"
send "clear line $line\r"
expect "confirm"
send "y\r"
exec sleep 2
expect "#"
send "exit\r"
expect "#"
}
clear_line $h3600
clear_line $l3600
spawn telnet 172.18.9.29 200$h3600
set id1 $spawn_id
expect "]"
spawn telnet 172.18.9.29 200$l3600
set id2 $spawn_id
expect "]"
proc login_fw_id1 { } {
global id1
set spawn_id $id1
send "\r"
exec sleep 5
expect {
"login" {send "admin\r"
expect "assword"
send "\r"
expect "#"
}
"#" {send "end\r"
expect "#"}
"assword" {send "aaa\r"
expect "login"
send "admin\r"
expect "assword"
send "\r"}
expect "#"
}
return $spawn_id
}
proc login_fw_id2 { } {
global id2
set spawn_id $id2
send "\r"
exec sleep 5
expect {
"login" {send "admin\r"
expect "assword"
send "\r"
expect "#"
}
"#" {send "end\r"
expect "#"}
"assword" {send "aaa\r"
expect "login"
send "admin\r"
expect "assword"
send "\r"}
expect "#"
}
return $spawn_id
}
proc GetStatus-1 { } {
set spawn_id [login_fw_id1]
send "get sys status\r"
expect "#"
}
proc GetStatus-2 { } {
set spawn_id [login_fw_id2]
send "get sys status\r"
expect "#"
}
GetStatus-1
GetStatus-2
Tuesday, March 10, 2009
Monday, February 23, 2009
Perl In 24
目 录
译者序
前言
第一部分 Perl基础
第1学时 Perl入门 3
1.1 安装Perl 3
1.1.1 等一等,也许你已经安装了Perl 4
#perl -v
1.1.2 在Windows 95/98/NT上安装Perl 5
1.1.3 在UNIX上安装Perl 6
1.1.4 在Macintosh系统上安装Perl 7
1.2 文档资料 7
1.2.1 某些特殊的文档资料举例 8
1.2.2 如果无法找到文档该怎么办 9
1.3 编写你的第一个Perl程序 9
1.3.1 键入程序 9
#!/usr/bin/perl
print "Hello, World\n";
1.3.2 运行程序 9
1.3.3 程序正确将会发生什么情况 10
1.3.4 Perl程序的具体运行过程 10
1.3.5 必须知道的一些情况 11
#man perlstyle > 建议打开-w 即warning
第2学时 Perl的基本构件:数字和字符串 14
2.1 直接量 14
字符串加双引号和单引号的主要差别是:使用单引号的字符串含义是非常直观的,单
引号字符串中的每个字符就是表示它自己的含义。在双引号中的字符串中, P e r l要查看是否存
在变量名或转义序列。
$name="James";
print "I met $name\n"; #James will be printed
print 'I met $name'; #won't print James
print "i met \$name'; #neither will this
2.1.1 数字 14
2.1.2 字符串 15
\ n 换行
\ r 回车
#如何砍掉\r. $r=
\ t 制表符
\ b 退格
\ u 将下一个字符改为大写
\ l 将下一个字符改为小写
\ \ 直接量反斜杠字符
\ ' 用单引号( ' ')括起来的字符串中的直接量'
\ " 用引号括起来的字符串中的直接量"
2.2 标量变量 , such as $value, 大小写敏感
P e r l中的标量变量在你使用它们之前,不必预先进行声明或
初始化。若要创建一个标量变量,只要使用它就行了。
2.3 表达式和运算符 18
2.3.1 基本运算符 18
2.3.2 数字运算符 19
5 + $t 加 5与$ t相加的和
$y - $x 减 $ y与$ x的差
$e * $pi 乘 $ e与$ p i的积
$f / 6 除 $ f除以6得出的商
24 % 5 求余数2 4除以5得出的余数( 4)
$x = $x + 2; ==> $x += 2;
$x = $x - 2; ==> $x -= 2;
4 * * 2 取幂取4的二次方
2.3.3 字符串运算符 19
2.4 其他运算符 20
r a n d r a n d(5) 返回从0到小于该参数值之间的一个随机数
字。如果该参数被省略,则返回0至1之间的
一个数字
2.4.1 单参数运算符 20
2.4.2 递增和递减 21
2.4.3 尖括号运算符 21
print "what is ur size?";
$size=
2.4.4 其他赋值运算符 22
2.4.5 关于字符串和数字的一些说明 22
[from BlackBook]
逻辑与4.2.20 和逻辑或4.2.21
&&; ||;
print "enter positive number up to 100\n";
while (<>) {
chomp;
if ($_>0 && $_<100 {
print "thank you\n";
}
其他运算符: .. ?: += -= <> ==> <>是
第3学时 控制程序流 26
3.1 语句块 26
3.2 if语句 27
3.2.1 其他关系运算符 28
3.2.2 “真”对于Perl意味着什么 29
3.2.3 逻辑运算符 30
3.3 循环 32
3.3.1 用while进行循环 32
3.3.2 使用for循环 33
for ($a=0; $a<10; $a=$a+2) {
xxx}
,f o r语句的3个组成部分中的每一个都是可有可无的,但是两个分号是必不可少的。
for ( ; $a<10; ) {}
3.4 其他流控制工具 33
3.4.1 奇特的执行顺序 33
3.4.2 明细控制 34
3.4.3 标号 35 label
3.4.4 退出Perl 35
last 推出当前loop; exit;
Note 1:
请注意,在上面这个例子中,为了将一个值赋予$ r,使用一个赋值运算
符=。为了测试$ r的值,使用等式运算符= =。这两个运算符有着很大的差别,
其作用是不同的。在你的程序中不要混淆它们的用法,因为调试非常困难。
请记住,运算符=用于赋值,而= =则用于测试一个等式。
<<<比较数字>>>
= = $x == $y 如果$ x等于$ y,则为真
> $x > $y 如果$ x大于$ y,则为真
< $x < $y 如果$ x小于$ y,则为真
>= $x >= $y 如果$ x大于或者等于$ y,则为真
< = $x <= $y 如果$ x小于或者等于$ y,则为真
! = $x != $y 如果$ x不等于$ y,则为真
<<<比较字母>>>
e q $s eq $t 如果$ s等于$ t,则为真
g t $s gt $t 如果$ s大于$ t,则为真
l t $s lt $t 如果$ s小于$ t,则为真
g e $s ge $t 如果$ s大于或者等于$ t,则为真
l e $s le $t 如果$ s小于或者等于$ t,则为真
n e $s ne $t 如果$ s不等于$ t,则为真
#!/usr/bin/perl -w
############## Structure IF###################
$im=int(rand 10);
print "Pick a number:";
$guess=;
chomp $guess; #don't forget to remove the new line.
if ($guess>$im) {
print "you guess too high\n"
} elsif ($guess<$im) {
print "u guess too low\n"
} else {
print "u got it right\n"
}
$old=0;
$new=$old || "default"; #if old is fault, new equal default
print "$new\n"
#############Loop While #################
$counter=0;
while ($counter < 10> {
print "still countering...\n"
$counter++
}
#############Loop for #################
for {$a=0; $a<10; $a=$a+2) {
print "a is now $a\n"
}
############Easy way################
if (test_expression) {
expression;
}
same as:
expression if (test_expression)
############last : jump out the loop###########
for ($i=0; $i<100; $i++) {
for ($j=0; $j<100; $j++) {
if ($i*$j ==1400) {
print "the produce is 1400\n";
last
} } }
###########My block############
MYBLOCK: while (1) {
last MYBLOCK;
}
###############EXIT PERL###############
while (1) {
exit 0;
}
第4学时 基本构件的堆栈:列表与数组 39
4.1 将数据放入列表和数组 39
若要创建一个新数组,并用一个项目列表填入该数组,只要编写下面这个代码即可:
@boy=qw(Greg Peter Bobby);
使用该运算符后,你就不必键入6个引号和2个逗号
数组变量可以与标量变量使用相同的名字,例如,$ n a m e s与@ n a m e s可以指不同的东西,$ n a m e s指一个标量变量,而@ n a m e s则指一个数组
4.2 从数组中取出元素 41
@trees=qw(oad cedar maple);
print $trees[2];
print "@trees"; #print whole array
4.2.1 寻找结尾 42=> $#array is the last member of the array.
4.2.2 关于上下文的详细说明 43
$a=$b; # Scalar on the left: this is scalar context.
@foo=@bar; # Array on the left: this is list context
($a)=@foo; # List on the left: this is also list context.
$b=@bar; # Scalar on the left: this is scalar context. 数组bar的最后element的索引号。
例子2;
$a=@foo;
$b=$#foo;
print "$a\n";
print "$b\n";
在该代码的结尾, $ a包含数字4,$ b包含数字3。为什么会出现这个差别呢?因为@ f o o是
在标量上下文中运行的,它返回$ a的元素的数量。$ b设置为最后一个元素的索引号,而索引
是从0开始计数的。
4.2.3 回顾以前的几个功能 44
4.3 对数组进行操作 45
4.3.1 遍历数组 46
4.3.2 在数组与标量之间进行转换 46
4.3.3 给数组重新排序 48
#!/usr/bin/perl -w
@foo=qw(water pepsi coke lemonade );
$a=@foo; #number of the list, 4
$b=$#foo; #number of last items in the list
print "$a\n";
print "$b\n";
if (@foo) { #array has 4 elements, true
print "the array has elements\n";
}
#############
@pets=('cat', 'dog', 'fish',);#understood
$last_pets=('cat', 'dog', 'fish',); #when left side is scalar, that means the last items in the list
#########
foreach $cone (@flavor) {
print "i's like a cone of $cone\n";
}
第5学时 进行文件操作 53
5.1 打开文件 53
P e r l中的文件句柄实际上是另一种类型的变量;,不同之处是句柄的名字前面没有类型标识符( $、@)。由
于这个原因,句柄名字最好使用大写字母
open (FILEHANDLER, pathname)
ex: open(MYTEXT, "novel.txt") ||die
close (MYTEXT);
5.1.1 路径名 54
5.1.2 出色的防错措施 55
5.1.3 以适当的方式运行die函数 56
5.2 读取文件 56
5.3 写入文件 58
5.4 自由文件、测试文件和二进制数据 60
5.4.1 自由文件句柄 60
5.4.2 二进制文件 60
5.4.3 文件测试运算符 61
open (MYFILE, "novel.txt") || die "Can't open: $!";
$line=;
######samele : FILE in WHILE loop#######
while () {
print $_;
}
sample 2:
open (MYFILE, "novel.txt") || die "Can't open: $!";
@contents=;
close (MYFILE);
####write to or append to#####
open (NEWFILE, ">output.txt");
open (NEWFILE, ">>output.txt");
####STDIN, STDOUT and STDERR####
$guess=;
...
第6学时 模式匹配 64
6.1 简单的模式 64
$pat=
$_="The phrase that pays";
if (/$pat/) { #Look for the user's pattern
print "\"$_\" contains the pattern $pat\n";
}
sample from BlackBook
[root@localhost ~]# perl -
while(<>) {
if (m/exit/i) {exit;} #/i, means don't care small or capital.
}
__END__
abc
exi
exit
=====
sample 2:
while ($line = <>) {
if ($line =~ m/exit/i) {exit;}
}
__END__
abc
exit
6.2 元字符 66
6.2.1 一个简单的元字符 66
6.2.2 非输出字符 66
6.2.3 通配符 66
6.2.4 字符类 68
6.2.5 分组和选择 69
6.2.6 位置通配符 69
6.3 替换 70
s/searchpattern/replacement/;
6.4 练习:清除输入数据 70
6.5 关于模式匹配的其他问题 71
6.5.1 对其他变量进行操作 71
6.5.2 修饰符与多次匹配 72
6.5.3 反向引用 73
6.5.4 一个新函数:grep 73
1, easy mode:
m/Simon/: find Simon in $_. 标量变量$
m/I won \$10 at the fair/; #the $ is treated as a literal dollar-sign.
if (m:/usr/local/bin/hangman:) { printn "found the hangmann game"}
if (/$pat/) #
如果将模式括起来的字符(称为界限符)是斜杠,那么编写模式匹配代码时也可以不带m。
因此,也可以将m / C h e e t o s写成/ C h e e t o s /
/ x { 5,10}/ x至少出现5次,但是不超过1 0次。
2, 分组和选择
if (/dogs|cats/) {
print "\$_ contains a ets"
}
第7学时 哈希结构 77
数组与哈希的差别是:哈希是按照名字来访问它们的标量的,而不是像数组那样使用数字标号进行访问
7.1 将数据填入哈希结构 77
$food{'apple'} = 'fruit';
$food{'pear'} = 'fruit';
$food{'carrot'} = 'vegetable';
7.2 从哈希结构中取出数据 78
%Movies = ( 'The Shining' => 'Kubrick', 'Ten Commandments' => 'DeMille', Goonies =>
'Spielberg');
print $Movies{'The Shining'};
7.3 列表与哈希结构 80
7.4 关于哈希结构的补充说明 81
7.4.1 测试哈希结构中的关键字 81
7.4.2 从哈希结构中删除关键字 81
7.5 用哈希结构进行的有用操作 81
7.5.1 确定频率分布 82
7.5.2 在数组中寻找惟一的元素 82
7.5.3 寻找两个数组之间的交汇部分
和不同部分 83
7.5.4 对哈希结构进行排序 84
$book {Dune}='Frank";
%food=(apple => 'fruint,, pear => 'fruit,);
=> 逗号箭头运算符之所以叫做这个名字,原因是它的作用类似于逗号(当
它用于分隔列表的项目时),并且它看上去像个箭头。
第8学时 函数 89
8.1 创建和调用子例程 89
8.1.1 返回子例程的值 90
8.1.2 参数 91
在子例程中,被传递的参数可以通过P e r l的特殊变量@ 来访问。下面这个代码段显示了
为函数传递参数(3个字符串直接量)和输出参数的情况:
sub printargs {
print join(',', @_); #将传递进来的参数放入数组@_中
}
printargs('market', 'home', 'roast beef');
访问数组元素: print $_[2]
若要像下面这个例子中那样,访问传递过来的各个参数,可以使用数组@ 上的下标,就
像你对任何其他数组操作时那样。请记住, $ [ 0 ](@ 的一个下标)与标量变量$ 毫不相干:
8.1.3 传递数组和哈希结构 91
sub Subroutine_name {
statementn1;
:
statementnx;
}
sample:
sub yesno {
print "r u sure";
$annswer=
}
yesno ();
============
sub two_by_four {
2*4;
}
print 8*two_by_four ();
===========
要传递子例程的参数
被传递的参数可以通过P e r l的特殊变量@ 来访问。
请记住, $ [ 0 ](@ 的一个下标)与标量变量$ 毫不相干:
sub print_3_argumennt {
print $_[2];
}
sub display_score {
($hits, $bat)=@_;
}
display_score (50, 210);
===
sub moonweight {
($weight)= @_;
return ($weight/6);
}
print moonweight (150);
。按照默认设置,
在你的程序的主体中和子例程中, P e r l的变量是可视的,这些类型的变量称为全局变量。
你要做的工作是使变量成为函数的专用变量。为此,必须使用m y操作符:
8.2 作用域 92
8.3 练习:统计数字 94
8.4 函数的脚注 96
8.4.1 声明local变量 96
8.4.2 使Perl变得更加严格 97
8.4.3 递归函数 98
8.5 课时小结 99
8.6 课外作业 99
8.6.1 专家答疑 99
8.6.2 思考题 99
8.6.3 解答 100
8.6.4 实习 100
第二部分 高级特性
第9学时 其他函数和运算符 103
9.1 搜索标量 103
9.1.1 用index进行搜索 103可以给i n d e x函数规定一个字符串中开始进行搜索的起始位置,如下面的例子
显示的那样。若要从左边开始搜索,使用的起始位置是0:
$reindeer="dasher dancer prancer vixen";
index($reindeer, "da"); # Returns 0, 默认从0开始
index($reindeer, "da", 1); # Returns 7, 从1开始
9.1.2 用rindex向后搜索 104
9.1.3 用substr分割标量 104
s u b s t r函数取出s t r i n g,从位置o ff s e t开始运行,并返回从o ff s e t到结尾的字符串的剩余部分
#Character positions in $a
# 0 10 20 30
$a="I do not like green eggs and ham.";
print substr($a, 25); # prints "and ham."
print substr($a, 14, 5); # prints "green"
9.2 转换而不是替换 105
9.3 功能更强的print函数 106
9.4 练习:格式化报表 107
9.5 堆栈形式的列表 109
9.6 课时小结 110
9.7 课外作业 111
9.7.1 专家答疑 111
9.7.2 思考题 111
9.7.3 解答 112
9.7.4 实习 112
第10学时 文件与目录 113
10.1 获得目录列表 113
10.2 练习:UNIX的grep 116
1: #!/usr/bin/perl -w #-w, warning
2:
3: use strict; #strict mode, 要先声明标量
4:
5: print "Directory to search: ";
6: my $dir=
7: print "Pattern to look for: ";
8: my $pat=
9:
10: my($file);
11:
12: opendir(DH, $dir) || die "Cannot open $dir: $!";
13: while ($file=readdir DH) { #readdir, 函数名
14: next if (-d "$dir/$file"); #确实是目录本身( - d)的任何目录条目均被拒绝。请注意,被核实的路 径名 是$ d i r / $ f i l e。核实该路径是必要的,因为当前目录中不一定存在$ f i l e,它存在于$ d i r中。因此该文件的全路径名是$ d i r / $ f i l e
15: if (! open(F, "$dir/$file") ) { #如果无法打开文件
16: warn "Cannot search $file: $!";
17: next;
18: }
19: while(
20: if (/$pat/) {
21: print "$file: $_";
22: }
23: }
24: close(F);
25: }
26: closedir(DH);
10.3 目录 117
10.3.1 浏览目录 117
10.3.2 创建和删除目录 118
10.3.3 删除文件 119
10.3.4 给文件改名 119
10.4 UNIX系统 120
10.5 你应该了解的关于文件的所有信息 121
10.6 练习:对整个文件改名 122
1: #!/usr/bin/perl -w
2:
3: use strict;
4:
5: my($dir, $oldpat, $newpat);
6: print "Directory: ";
7: chomp($dir=
8: print "Old pattern: ";
9: chomp($oldpat=
10: print "New pattern: ";
11: chomp($newpat=
12:
13: opendir(DH, $dir) || die "Cannot open $dir: $!";
14: my @files=readdir DH; #第1 3 ~ 1 5行:$ d i r指明的目录中的条目被读入@ f i l e s。
15: close(DH);
16: my $oldname;
17: foreach(@files) {
18: $oldname=$_;
19: s/$oldpat/$newpat/;
#第1 7 ~ 1 9行:来自@ f i l e s的每个文件均被赋给$ _,并且该名字被保存在$ o l d n a m e中。然
后,$_中的原始文件名被改为1 9行上的新名字。
20: next if (-e "$dir/$_");
21: if (! rename "$dir/$oldname", "$dir/$_") {
22: warn "Could not rename $oldname to $_: $!"
23: } else {
24: print "File $oldname renamed to $_\n";
25: }
26: }
第11学时 系统之间的互操作性 126
11.1 system()函数 126
11.2 捕获输出 128
11.3 管道 129
11.4 可移植性入门 131
system command
system ("ls -l");
这个方法很麻烦,不是一个十分聪明的办法。P e r l有另外一个方法处理这个问题,即反引
号。用反引号( ` `)括起来的任何命令均由P e r l作为外部命令来运行,就像通过s y s t e m运行的
一样,其输出被捕获,并且作为反引号的返回值返回。
$directory=`dir`;
@dir=`dir`;
foreach (@dir) {
#process each line
}
======
管道
dir > oldfile
sort oldfile > newfile
more newfile
====> Better way:
dir | sort | more
第12学时 使用Perl的命令行工具 137
12.1 什么是调试程序 137
12.1.1 启动调试程序 137
12.1.2 调试程序的基本命令 138
12.1.3 断点 139
12.1.4 其他调试程序命令 140
12.2 练习:查找错误 141
12.3 其他命令行特性 142
12.3.1 单命令行程序 142
12.3.2 其他开关 143
12.3.3 空的尖括号与更多的单命令
行程序 144
12.4 课时小结 145
12.5 课外作业 145
12.5.1 专家答疑 145
12.5.2 思考题 146
12.5.3 解答 146
第13学时 引用与结构 147
13.1 引用的基本概念 147
13.1.1 对数组的引用 149
13.1.2 对哈希结构的引用 149
13.1.3 作为参数的引用 150
13.1.4 创建各种结构 151
13.2 结构的配置方法 152
13.2.1 一个例子:列表中的列表 152
13.2.2 其他结构 153
13.2.3 使用引用来调试程序 154
13.3 练习:另一个游戏——迷宫 155
13.4 课时小结 157
13.5 课外作业 157
13.5.1 专家答疑 157
13.5.2 思考题 158
13.5.3 解答 158
13.5.4 实习 158
第14学时 使用模块 159
14.1 模块的概述 159
14.1.1 读取关于模块的文档 160
#perldoc Cwd
#perldoc Socket
在这个例子中,C w d模块实际上允许你使用3个新函数,即c w d、g e t c w d和f a s t g e t c w d。如
果你想使用这些函数,请阅读关于C w d模块的文档。
14.1.2 什么地方可能出错 161
14.2 已安装模块简介 162
14.2.1 文件和目录简介 162
14.2.2 拷贝文件 164
14.2.3 用于通信的Perl模块 164
14.2.4 使用English模块 165
14.2.5 diagnostics模块 165
14.3 标准模块的完整列表 166
14.4 课时小结 167
14.5 课外作业 167
14.5.1 专家答疑 167
14.5.2 思考题 168
14.5.3 解答 168
14.5.4 实习 168
第15学时 了解程序的运行性能 169
15.1 DBM文件 169
15.1.1 需要了解的重点 170
15.1.2 遍历与DBM文件相连接的哈
希结构 170
15.2 练习:一种自由格式备忘记事板 171
15.3 将文本文件用作数据库 173
15.4 随机访问文件 175
15.4.1 打开文件进行读写操作 175
15.4.2 在读写文件中移动 176
15.5 锁定文件 176
15.5.1 锁定UNIX和NT下的文件 178
15.5.2 在加锁情况下进行读写操作 179
15.5.3 Windows 95和Windows 98下的
加锁问题 180 15.5.4 在其他地方使用文件锁的问题 181
15.6 课时小结 181
15.7 课外作业 181
15.7.1 专家答疑 181
15.7.2 思考题 182
15.7.3 解答 182
15.7.4 实习 182
第16学时 Perl语言开发界 183
16.1 Perl究竟是一种什么语言 183
16.1.1 Perl的简单发展历史 183
16.1.2 开放源 184
16.1.3 Perl的开发 185
16.2 Perl综合存档文件网 185
16.2.1 什么是CPAN 186
16.2.2 为什么人们愿意提供自己的开
发成果 186
16.3 下一步你要做的工作 187
16.3.1 要做的第一步工作 187
16.3.2 最有用的工具 187
16.3.3 查找程序中的错误 188
16.3.4 首先要靠自己来解决问题 188
16.3.5 从别人的程序错误中吸取教训 189
16.3.6 请求他人的帮助 190
16.4 其他资源 191
16.5 课时小结 192
16.6 课外作业 192
16.6.1 专家答疑 192
16.6.2 思考题 192
16.6.3 解答 192
第三部分 将Perl用于CGI
第17学时 CGI概述 195
17.1 浏览Web 195
17.1.1 检索一个静态Web页 196
17.1.2 动态Web页—使用CGI 197
17.2 不要跳过这一节内容 198
17.3 编写你的第一个CGI程序 199
17.3.1 在服务器上安装CGI程序 200
17.3.2 运行你的CGI程序 201
17.4 CGI程序无法运行时怎么办 201
17.4.1 这是你的CGI程序吗 201
17.4.2 服务器存在的问题 202
17.4.3 排除服务器内部错误或500错误 203
17.5 课时小结 204
17.6 课外作业 204
17.6.1 专家答疑 204
17.6.2 思考题 205
17.6.3 解答 205
17.6.4 实习 206
第18学时 基本窗体 207
18.1 窗体是如何运行的 207
18.1.1 HTML窗体元素概述 207
18.1.2 单击submit时出现的情况 208
18.2 将信息传递给你的CGI程序 209
18.3 Web安全性 211
18.3.1 建立传输明码文本的连接 211
18.3.2 注意不安全数据 212
18.3.3 从事无法执行的操作 213
18.3.4 拒绝服务 213
18.4 宾客留言簿 214
18.5 课时小结 215
18.6 课外作业 215
18.6.1 专家答疑 215
18.6.2 思考题 216
18.6.3 解答 216
18.6.4 实习 216
第19学时 复杂窗体 217
19.1 复杂的多页窗体 217
19.2 隐藏域 217
19.3 多页调查窗体 219
19.4 课时小结 224
19.5 课外作业 224
19.5.1 专家答疑 224
19.5.2 思考题 225
19.5.3 解答 225
19.5.4 实习 225
第20学时 对HTTP和CGI进行操作 226
20.1 HTTP通信概述 226
20.1.1 举例:人工检索Web页 227
20.1.2 举例:返回非文本信息 228
20.2 如何调用CGI程序的详细说明 230
20.2.1 将参数传递给CGI程序 230
20.2.2 特殊参数 231
20.3 服务器端的包含程序 232
20.4 部分环境函数简介 234
20.5 重定向 235
20.6 课时小结 237
20.7 课外作业 237
20.7.1 专家答疑 237
20.7.2 思考题 237
20.7.3 解答 238
20.7.4 实习 238
第21学时 cookie 239
21.1 什么是cookie 239
21.1.1 如何创建cookie 240
21.1.2 举例:使用cookie 241
21.1.3 另一个例子:cookie查看器 242
21.2 高级cookie特性 243
21.2.1 设置cookie终止运行的时间 243
21.2.2 cookie的局限性 244
21.2.3 将cookie发送到其他地方 244
21.2.4 限制cookie返回到的位置 246
21.2.5 带有安全性的cookie 247
21.3 cookie存在的问题 247
21.3.1 cookie的生存期很短 247
21.3.2 并非所有浏览器都支持cookie 247
21.3.3 有些人不喜欢cookie 247
21.4 课时小结 248
21.5 课外作业 248
21.5.1 专家答疑 248
21.5.2 思考题 249
21.5.3 解答 250
21.5.4 实习 250
第22学时 使用CGI程序发送电子邮件 251
22.1 Internet邮件入门 251
22.1.1 发送电子邮件 252
22.1.2 发送邮件时首先应该注意的问题 252
22.2 邮件发送函数 253
22.2.1 用于UNIX系统的邮件函数 254
22.2.2 用于非UNIX系统的邮件函数 255
22.3 从Web页发送邮件 257
22.4 课时小结 259
22.5 课外作业 259
22.5.1 专家答疑 259
22.5.2 思考题 260
22.5.3 解答 260
22.5.4 实习 260
第23学时 服务器推送和访问次数计数器 261
23.1 什么是服务器推送 261
23.1.1 激活服务器推送特性 262
23.1.2 一个小例子:更新Web页上
的时钟 262
23.1.3 另一个例子:动画 263
23.1.4 客户机拖拉技术 264
23.2 访问次数计数器 264
23.2.1 编写一个访问次数计数器程序 266
23.2.2 图形访问次数计数器 267
23.3 课时小结 268
23.4 课外作业 269
23.4 1 专家答疑 269
23.4.2 思考题 269
23.4.3 解答 269
23.4.4 实习 270
第24学时 建立交互式Web站点 271
24.1 借用另一个站点的内容 271
24.1.1 注意内容的版权问题 271
24.1.2 举例:检索标题 272
24.2 调查窗体 275
24.2.1 调查窗体程序的第一部分:
提出问题 276
24.2.2 调查窗体程序的第二部分:
计算调查结果 277
24.3 课时小结 280
24.4 课外作业 280
24.4.1 专家答疑 280
24.4.2 思考题 281
24.4.3 解答 281
24.4.4 实习 281
第四部分 附录
附录 安装模块 285
a, perl -MCPAN -e shell (error: can't locate CPAN.pm)
#yum install perl-CPAN
Q&A
1, 如何检查语法?
a, perl -
print "hello\n";
__END__
==>hello
b, perl -e 'print "hello "; "there\n"'
==>hello there
c, perl -c firemissile.pl
==>只检查,不执行
2, 表和字符串
由表到串join =》 print join (":", "12","00");
12:00
由串到表split=>print ((split " ", "now is the time")[3]);
time