Rename: jpg2jpeg

Fedora Core 5不喜欢jpg这个后缀,认为存在安全隐患,所以Gnome程序都不把jpg文件当成是图片,没有关联任何应用程序,而且Nautilus不会显示预览,gthumb里面也不会看到,除非把后缀名改为jpeg。然而,我的柯达导入的照片全部是以jpg作为后缀名的,只好写了一个Perl脚本,完成从jpg到jpeg的重命名工作。

#!/usr/bin/perl
use strict;
use warnings;
use File::Find;

my @dir;

push @dir, '.';
for my $additional_directory (@ARGV) {
    if (-e $additional_directory and -d _) {
        push @dir, $additional_directory;
    }
    else {
        warn "$additional_directory not exist or not a directory, skip.n";
    }
}

find(&jpg2jpeg, @dir);

sub jpg2jpeg {
    if (/(.+).jpg$/i) {
        my $filename = "$File::Find::dir/$1.jpeg";
        print "rename $File::Find::name to $filename ...n";
        rename $File::Find::name, $filename;
    }
}

Encode

这两天在用Perl写一个程序,从一个网页上抽取出某个表格的内容,然后存起来供日后使用。

取网页用LWP::UserAgent,分析表格使用HTML::TableExtract,保存使用Config::General。然而,在用Config::General读取它自己存的文件时出了问题,根源在于编码。网页编码是GB2312,而Perl的内部表示使用Unicode,所以Perl把中文字符看成是一系列奇怪的字节,而Config::General偏偏使用chr(182)作为一个特殊的标志,用来处理Here-Document。当某些中文字符恰好含有这个字节的时候,Config::General就被骗了。

一度,我只好把数据存为CSV格式。

后来在Advanced Perl Programming第二版上看到6.5节Encode后,把网页内容读入后用decode处理一下,在print出去之前再用encode处理一下,就可以了。而Config::General保存的文件本身就是Unicode,所以无需使用Encode来处理。

举个例子

use LWP::UserAgent;
use Encode;

$browser = new LWP::UserAgent;
$response = $browser->get('http://some.where');
$content = decode('euc-cn', $response->content);

这样,一个汉字就会被当成一个字,而不是一系列字节。这里euc-cn就代表gb2312,对于Encode来说它们是同义词,或者说gb2312是euc-cn的alias。

直接打印经过decode的字符串会产生警告,去掉警告的方法是再encode一下,如:

$content = encode('utf8', $content);
print $content, "n";