今天收获不少。一整天都在学习 perl 了,却忘记了工作上的事情。也罢,来加班吧。
今天还知道了 putty cygwin 可以设置 translation charset 的。这样,可以实现输入和编辑中文。终端下,vi 和 emacs 都没有问题。这岂不是意味着可以在公司做翻译的事情了。退一万步,有了一个比 gnome-terminal 还好的终端,感觉真好。设置了 ssh 远程访问(key auth),再使用 screen,再结合这么好的 terminal,简直是太高兴了。Hahahaha!
黑色背景的 putty cygwin 窗口中,vi 最好的 colorscheme 是 torte
[13:35] <byuan> 怎么改变 screen 的配色呢
[13:42] hellwolf~ 在不在?
[13:53] <byuan> hellwolf~ 为啥 *b = *a 没有效果呢,$a 是个字符串,$b 是什么?
[13:55] <hellwolf> byuan, glob
[13:57] <byuan> 那怎么从 $b 得到 $a 呢?
<hellwolf> byuan, 只要 $b 不是 my 声明的变量即可 用 local *b = \$a
<hellwolf> byuan, 这里面的问题是 my 声明的变量没有typeglobs
<byuan> 我知道这个样子的写法,可是所有书上都写了 *b = *a,这个却试验不出来
[14:05] <hellwolf> 你可以 $ perl -Mstrict -e 'our $a=1;local *b = *a; print $b,"\n"' 1
<byuan> 哦,意思是不可以用 *a 了,let me see.
<hellwolf> 但如果你把our变成了my
<byuan> our 和 local 都可以么?
<hellwolf> 就不行
[14:06] 如果你理解了our local my,那你就会明白了
<byuan> 怪不得总是会找 *Main::a 而不是 my $a
<hellwolf> 你也可以不理解,这本来就是Larry搞出来的怪胎
[14:08] *a 和 \$a 有时是同一个东西,当$a 不是my 声明的变量的时候
my 声明的变量在perl的临时变量区域中
而不在perl的typeglobs中
<byuan> 书上写得清楚,my 就是当前词法范围,我没注意看 glob 和这个的关系。。
[14:09] <hellwolf> 书上其实不清楚
my的词法作用域的功能是在他诞生之后赋予的
[14:10] 是它的实现恰好在某种意义上可以完成这种语法功能
而Larry 写他的时候并不是认为它是词法作用域的
<byuan> 那历史上是?
<hellwolf> 如果从实现上看,问题很好解释,如果从语法上说,事情往往会变复杂
[14:11] 历史上是“Larry创造的一陀bullshit“,事实上就是这样的,去 看黑豹书,上面有关于my local our的在perl实现级别上的解释
比什么词法,动态作用域好懂的多
<byuan> 请问 全局变量如果不加修饰,隐含的是 our 吗?还是 local?
[14:12] <hellwolf> local 是个更大的 bullshit
不要认为local是“局部“的意思
<byuan> local 大概是暂时隐藏全局变量
[14:13] <hellwolf> 不加修饰的变量不是my 的
因为my的诞生远远玩于use strict的诞生
my的历史比你想象的短得多
[14:14] 不过一般来说,不加use strict; use warning的程序除了在perl golf上使用,已经很少有人愿意这个干了
[14:16] <byuan> 倒是可以把 local 理解成 xslt2 的参数传递管道
[14:17] <shpchp> perl ...... 不知道怎么搞的, 对我来说这门语言比 c, c++, java, .net, php, python 都难许多
[15:09] <byuan> hellwolf~ 差不多懂了,谢谢
[15:21] [14:05] <hellwolf> 你可以 $ perl -Mstrict -e 'our $a=1;local *b = *a; print $b,"\n"' 1 但是我还得用 our $b 不然会提示 print $b 出错, $b 没有导入
[15:23] <hellwolf> byuan, -Mstrict 看见了么
byuan, strict后不能用没声明的变量
[16:08] <byuan> local is also used for localizing typeglobs, which, as it turns out, is the only way of getting local filehandles, formats, and directory handles. <= hellwolf, 这一句在 use strict 之后岂不是没法实现了?
[16:11] <hellwolf> byuan, 不知道你在说什么
[16:13] <byuan> 我搞个 filehandle 试验下
[16:21] <byuan> 118 our $fh;
119 *fh = *STDOUT;
120 print *fh "fh is: ", *fh, "\n"; 这个为啥是错的呢,直接 print STDOUT "fh is: ", *fh, "\n"; 得到的是 fh is: *main::STDOUT
[16:22] 倒是可以用 print fh "fh is: ", *fh, "\n";
[16:27] filehandler 不需要声明..
[16:54] <byuan> hellwolf~ 帮我看这句话为啥不行。
135 my $fh2 = &openfile("test2.txt", "<");
136 local *STDIN = $fh2;
137 print while(<>);
[17:05] <hellwolf> byuan, 要这样
byuan, 不是用 =
byuan, fh 的拷贝要用到 dup(2)
<hellwolf> byuan, perl里有几种办法实现dup(2)
[17:18] <byuan> hellwolf~ 最常用的?。。。。
[17:38] <hellwolf> byuan, 刚才没复制?
<hellwolf> byuan, ... 似乎是的
[17:40] * byuan dying
<hellwolf> ==,我写个例子
<byuan> open(STDIN, "<&$fh2");
<byuan> hellwolf~ 是 perlopentut 的 REOPEN 那一节吧?
[17:44] <hellwolf> byuan, no perldoc -f open 足够
[17:45] <byuan> 没看着
[17:49] <byuan> putty-cygwin 竟然可以支持编辑中文..
<byuan> OMG. 这样岂不是可以在公司做翻译了。微软拼音比SCIM还好用呢
[17:52] <hellwolf> 公司会起诉你的
<hellwolf> byuan, 这里面要搞清一个问题是,你想达到重新定向STDIN/STDOUT等的目的,在pe rl里仍然是基于传统的unix file description number来的,和那些名字无关
byuan, 也就是说while(<>)是在读0
[17:58] byuan, 是STDIN背后的0
<byuan> sure
<hellwolf> byuan, 而不是读STDIN《——这个变量
<hellwolf> byuan, 那在C里怎么做的呢
byuan, 就在perl里模拟这样做
byuan, 先close,然后dup
<hellwolf> byuan, 或者先close 然后open
[17:59] <byuan> 本来就只看书,没实地用过...
[18:00] <hellwolf> open my $fh, "<", "1.pl" or die "open failed 1\n";
close STDIN;
open STDIN, '>&', fileno($fh) or die "dup failed 2\n";
print while(<>);
<hellwolf> open my $fh --> open(2) 函数,返回fd=3
close STDIN --> close(2), 关闭 fd=0
<hellwolf> open '>&' --> dup(2) 函数,这个在perldoc -f open里有说明,效果就是dup fd 3-> fd 0, 因为0是最小可分配的
当然,实际中经常要你保存一下STDIN
[13:42] hellwolf~ 在不在?
[13:53] <byuan> hellwolf~ 为啥 *b = *a 没有效果呢,$a 是个字符串,$b 是什么?
[13:55] <hellwolf> byuan, glob
[13:57] <byuan> 那怎么从 $b 得到 $a 呢?
<hellwolf> byuan, 只要 $b 不是 my 声明的变量即可 用 local *b = \$a
<hellwolf> byuan, 这里面的问题是 my 声明的变量没有typeglobs
<byuan> 我知道这个样子的写法,可是所有书上都写了 *b = *a,这个却试验不出来
[14:05] <hellwolf> 你可以 $ perl -Mstrict -e 'our $a=1;local *b = *a; print $b,"\n"' 1
<byuan> 哦,意思是不可以用 *a 了,let me see.
<hellwolf> 但如果你把our变成了my
<byuan> our 和 local 都可以么?
<hellwolf> 就不行
[14:06] 如果你理解了our local my,那你就会明白了
<byuan> 怪不得总是会找 *Main::a 而不是 my $a
<hellwolf> 你也可以不理解,这本来就是Larry搞出来的怪胎
[14:08] *a 和 \$a 有时是同一个东西,当$a 不是my 声明的变量的时候
my 声明的变量在perl的临时变量区域中
而不在perl的typeglobs中
<byuan> 书上写得清楚,my 就是当前词法范围,我没注意看 glob 和这个的关系。。
[14:09] <hellwolf> 书上其实不清楚
my的词法作用域的功能是在他诞生之后赋予的
[14:10] 是它的实现恰好在某种意义上可以完成这种语法功能
而Larry 写他的时候并不是认为它是词法作用域的
<byuan> 那历史上是?
<hellwolf> 如果从实现上看,问题很好解释,如果从语法上说,事情往往会变复杂
[14:11] 历史上是“Larry创造的一陀bullshit“,事实上就是这样的,去
比什么词法,动态作用域好懂的多
<byuan> 请问 全局变量如果不加修饰,隐含的是 our 吗?还是 local?
[14:12] <hellwolf> local 是个更大的 bullshit
不要认为local是“局部“的意思
<byuan> local 大概是暂时隐藏全局变量
[14:13] <hellwolf> 不加修饰的变量不是my 的
因为my的诞生远远玩于use strict的诞生
my的历史比你想象的短得多
[14:14] 不过一般来说,不加use strict; use warning的程序除了在perl golf上使用,已经很少有人愿意这个干了
[14:16] <byuan> 倒是可以把 local 理解成 xslt2 的参数传递管道
[14:17] <shpchp> perl ...... 不知道怎么搞的, 对我来说这门语言比 c, c++, java, .net, php, python 都难许多
[15:09] <byuan> hellwolf~ 差不多懂了,谢谢
[15:21] [14:05] <hellwolf> 你可以 $ perl -Mstrict -e 'our $a=1;local *b = *a; print $b,"\n"' 1 但是我还得用 our $b 不然会提示 print $b 出错, $b 没有导入
[15:23] <hellwolf> byuan, -Mstrict 看见了么
byuan, strict后不能用没声明的变量
[16:08] <byuan> local is also used for localizing typeglobs, which, as it turns out, is the only way of getting local filehandles, formats, and directory handles. <= hellwolf, 这一句在 use strict 之后岂不是没法实现了?
[16:11] <hellwolf> byuan, 不知道你在说什么
[16:13] <byuan> 我搞个 filehandle 试验下
[16:21] <byuan> 118 our $fh;
119 *fh = *STDOUT;
120 print *fh "fh is: ", *fh, "\n"; 这个为啥是错的呢,直接 print STDOUT "fh is: ", *fh, "\n"; 得到的是 fh is: *main::STDOUT
[16:22] 倒是可以用 print fh "fh is: ", *fh, "\n";
[16:27] filehandler 不需要声明..
[16:54] <byuan> hellwolf~ 帮我看这句话为啥不行。
135 my $fh2 = &openfile("test2.txt", "<");
136 local *STDIN = $fh2;
137 print while(<>);
[17:05] <hellwolf> byuan, 要这样
byuan, 不是用 =
byuan, fh 的拷贝要用到 dup(2)
<hellwolf> byuan, perl里有几种办法实现dup(2)
[17:18] <byuan> hellwolf~ 最常用的?。。。。
[17:38] <hellwolf> byuan, 刚才没复制?
<hellwolf> byuan, ... 似乎是的
[17:40] * byuan dying
<hellwolf> ==,我写个例子
<byuan> open(STDIN, "<&$fh2");
<byuan> hellwolf~ 是 perlopentut 的 REOPEN 那一节吧?
[17:44] <hellwolf> byuan, no perldoc -f open 足够
[17:45] <byuan> 没看着
[17:49] <byuan> putty-cygwin 竟然可以支持编辑中文..
<byuan> OMG. 这样岂不是可以在公司做翻译了。微软拼音比SCIM还好用呢
[17:52] <hellwolf> 公司会起诉你的
<hellwolf> byuan, 这里面要搞清一个问题是,你想达到重新定向STDIN/STDOUT等的目的,在pe
byuan, 也就是说while(<>)是在读0
[17:58] byuan, 是STDIN背后的0
<byuan> sure
<hellwolf> byuan, 而不是读STDIN《——这个变量
<hellwolf> byuan, 那在C里怎么做的呢
byuan, 就在perl里模拟这样做
byuan, 先close,然后dup
<hellwolf> byuan, 或者先close 然后open
[17:59] <byuan> 本来就只看书,没实地用过...
[18:00] <hellwolf> open my $fh, "<", "1.pl" or die "open failed 1\n";
close STDIN;
open STDIN, '>&', fileno($fh) or die "dup failed 2\n";
print while(<>);
<hellwolf> open my $fh --> open(2) 函数,返回fd=3
close STDIN --> close(2), 关闭 fd=0
<hellwolf> open '>&' --> dup(2) 函数,这个在perldoc -f open里有说明,效果就是dup fd 3-> fd 0, 因为0是最小可分配的
当然,实际中经常要你保存一下STDIN