perl 的 __END____DATA__ 符号

__DATA__ 符号告诉 perl 编译器, perl 代码的编译已经完成。

任何在 __DATA__ 符号后面的数据都可以通过 FOOBAR::DATA 这个文件句柄读到, FOOBAR 就是当前包的包名。

在 'main' 包里, __END__ 符号和 __DATA__ 一样, 但是对于别的模块, __END__ 后的数据是无法自动放入DATA句柄中的, 而 __DATA__ 后的数据可以。

例1

#!/usr/bin/perl
use strict;
use warnings;
while ( <DATA> ) {
    print;
}

__DATA__  # 这时候用 __END__ 一样
abc
123
woaini

例2

# 先写个包 FOOBAR.pm
package FOOBAR;
1;
__DATA__ # 这时候如果用 __END__ 就不能通过 FOOBAR::DATA 这个句柄获得其后面的数据
abc
123
woaini

# 写个脚本调用 FOOBAR 这个包
#!/usr/bin/perl
use strict;
use warnings;
use lib './';
use FOOBAR;
while ( <FOOBAR::DATA> ) {
    print;
}

Perl

这篇文章: 有用 无用
创建 2014-08-11 10:32:50 / 更新 2017-02-07 14:59:09

图片优化

  1. 先解释几个名词吧

    1.1) Transparency (透明度)

    1.2) Animation (动画)

    1.3) Lossy (有损)

    1.4) Horizontal scanning (水平扫描)

    1.5) Progressive (渐进)

    1.6) Interlacing (交错)

  2. 如何优化

    2.1) Crushing PNGs

    pngcrush -rem alla -brute -reduce src.png dest.png
    

    2.2) Stripping JPEG metadata

    jpegtran -copy none -optimize src.jpg > dest.jpg
    

    2.3) Converting single-image (nonanimated) GIFs to PNGs

    # Tool: ImageMagick
    convert source.gif destination.png
    identify -format %m my.gif # determine whether the GIF file contains an animation
    

    2.4) Optimizing GIF animations

    # Tool: Gifsicle
    gifsicle -O2 src.gif > dest.gif
    

网站加速

这篇文章: 有用 无用
创建 2014-08-07 10:21:43 / 更新 2017-02-07 14:59:12

为什么 mysql slave 同步慢

  1. show slave status\G

  2. 查看 Relay_Log_File 字段, 得到 relay log 的文件名

  3. cd /var/lib/mysql

  4. mysqlbinlog mysqld-relay-bin.005347 > /tmp/mysqld-relay-bin.005347.txt

  5. grep 'update ' /tmp/mysqld-relay-bin.005347.txt | perl -ane 'END {foreach ( sort {$seen{$b}<=>$seen{$a}} keys %seen ) {print $_, "=>", $seen{$_}, "\n"} } $seen{$F[1]}++' # 找出哪个表更新的多

    grep 'insert into ' /tmp/mysqld-relay-bin.005347.txt | perl -ane 'END {foreach ( sort {$seen{$b}<=>$seen{$a}} keys %seen ) {print $_, "=>", $seen{$_}, "\n"} } $seen{$F[2]}++' # 找出哪个表插入的多


MySQL

这篇文章: 有用 无用
创建 2014-07-25 11:41:25 / 更新 2017-02-07 14:59:20

Perl Command-Line Options

-c # compiles the program without runing it.

-M # -Mmodule 和 use module 一样.

例如:

-MLWP::Simple
-MDigest::MD5='md5_hex,md5_base64'

-m # -mmodule 和 use module() 一样, 不会导入 module 默认导入的包.

-n # add loops around your -e code.

$ perl -n -e 'some code' $file

相当于:

LINE:
    while (<>) { 
        #some code 
    }

-p

$ perl -p -e 'some code' $file

相当于:

LINE:
    while (<>) { 
        #some code 
    } continue {
        print or die $!;
    }

假如在 main code loop 之前或之后需要处理代码, 你可以使用 BEGIN 或 END block.

例如:

$ perl -ne 'END {print $t} @w = /(\w+)g; $t += @w' $file

-a # 打开自动分割模式(autosplit mode), 输入会被分割(默认是一个或多个空格分割)成数组并存入 @F

例如:

$ perl -ane 'END {print $t} $t += @F'

-F # 指定分割字符

例如:

$ perl -F'\t' -MData::Dumper -ane 'print Dumper \@F' $file

-l # 自动 chomps 输入, 设置 $\ 等于 $/. $\ 是输出后面加的字符, 默认是空串(empty string). $/ 是读入的分割符, 默认是新行(new line)

例如:

$ perl -le 'print "Hello World"'
$ perl -le 'print for @INC' # 打印出 @INC
$ perl -F':' -MData::Dumper -alne 'print Dumper \@F' /etc/passwd # 对比加 l 和不加 l 的区别
$ perl -lp -e '$_ = $_ . "abc"' $file # 对比加 l 和不加 l 的区别

-i # 把输入文件(源文件)改名(rename), 并且读改名后的文件, 把转化后的记录写入名字是源文件的名字的文件(其实是一种比较有效的覆盖源文件的方法)

例如:

$ perl -i -pe 's/\bPHP\b/Perl/' $file
$ perl -i.bak -pe 's/\bPHP\b/Perl/' $file # 把源文件保存在 "源文件名.bak"
$ 对比 perl -pi -e 's/\bPHP\b/Perl/' $file 和 perl -ip -e 's/\bPHP\b/Perl/' $file # 因为 i 后面可以跟参数, 所以后者无效

Perl

这篇文章: 有用 无用
创建 2014-07-11 20:47:07 / 更新 2017-02-07 14:59:27