Perl Irssi脚本:重命名无效的DCC文件
我在Windows上,使用Irssi客户端Irssi-win32-0.8.12.exe 我在接收具有无效名称的文件时遇到问题:Perl Irssi脚本:重命名无效的DCC文件,perl,scripting,irssi,Perl,Scripting,Irssi,我在Windows上,使用Irssi客户端Irssi-win32-0.8.12.exe 我在接收具有无效名称的文件时遇到问题: ..nameo_\u2605_name.. (err: DCC can't create file) 如何使用脚本从文件名\u2605中删除此无效部分 没用 我认为这与此有关。从195号线开始 /* if some plugin wants to change the file name/path here.. */ signal_emit("dcc get rece
..nameo_\u2605_name.. (err: DCC can't create file)
如何使用脚本从文件名\u2605中删除此无效部分
没用
我认为这与此有关。从195号线开始
/* if some plugin wants to change the file name/path here.. */
signal_emit("dcc get receive", 1, dcc);
我当然希望Windows上的Irssi接受用Perl编写的脚本。如果是这种情况,以下是解决方案:
use strict;
use warnings;
our $VERSION = "1.0";
our %IRSSI = ();
# interception made by registering signal as first + Irssi::signal_continue()
sub event_ctcp_dccsend {
my ($server, $args, $nick, $addr, $target) = @_;
# split incomming send request args into filename (either before first space or
# quoted), and the rest (IP, port, +optionally filesize)
my ($filename, $rest) = $args =~ /((?:".*")|\S*)\s+(.*)/;
# remember file name for informing sake
my $oldname = $filename;
# replace backslashes with "BSL" (change to anything you wish)
if ($filename =~ s/\\/BSL/g) {
# some info for user
Irssi::print('DCC SEND request from '.$nick.': renamed bad filename '.$oldname.' to '.$filename);
$args = $filename." ".$rest;
# propagate signal; Irssi will proceed the request with altered arguments ($args)
Irssi::signal_continue($server, $args, $nick, $addr, $target);
}
}
# register signal of incoming ctcp 'DCC SEND', before anything else
Irssi::signal_add_first('ctcp msg dcc send', 'event_ctcp_dccsend');
该脚本截获DCC SEND ctcp消息,并将文件名中的所有反斜杠替换为BSL字符串,然后将消息的修改参数转发给任何其他脚本和Irssi。
如果要删除所有\uxxx,请使用s/\\u\w{4}//g代替s/\\/BSL/g
我希望有帮助 \u2605是Unicode U+2605,一个黑星-★. 您不能只删除Unicode文件名中的字符,因为这样会有文件名冲突的风险。您需要在整个程序中支持Unicode。我将以某种方式解决文件名冲突。真正的目的是能够更改文件名。我会设法解决文件名冲突。真正的目的是能够在获取时更改文件名,而不是在加载后。这没关系——要么只使用ascii文件名,要么将所有空格改为下划线。