Yuan Yijun (bbbush) wrote,
Yuan Yijun
bbbush

open

perldoc -f open 或者 perldoc perlopentut。有个 reopen 的概念,Hellwolf 说是 dup2()。在 POSIX 模块也有一个 dup2 不过不知道怎么判断返回值,而 open 就可以判断 @!

今天收获不少。一整天都在学习 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等的目的,在perl里仍然是基于传统的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

Tags: perl, 工作
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 2 comments