小编pla*_*ect的帖子

为什么重复打开、追加和关闭文本文件会导致行以相反的顺序写入?

为什么以下 perl 代码:

for(open(my $fh, ">>", "test.txt")){
    print $fh "one\n";
}
for(open(my $fh, ">>", "test.txt")){
    print $fh "two\n";
}
for(open(my $fh, ">>", "test.txt")){
    print $fh "three\n";
}
Run Code Online (Sandbox Code Playgroud)

将以下内容写入 test.txt?

three
two
one
Run Code Online (Sandbox Code Playgroud)

为什么顺序颠倒了?我的理解是每个for块会在块退出时自动关闭文件。这不应该导致 perl 在下一个块开始之前刷新任何缓冲区吗?我希望这段代码可以打开文件,写一行,关闭文件,然后再重复所有这些步骤两次。我错过了什么?

我用 Perl 5.26.1 测试了这个,在 Ubuntu 18.04.3 上运行。

(是的,我知道只需将所有print语句放在同一个块中,我就可以轻松地以正确的顺序编写行。这不是这里的问题。我想了解为什么会发生这种行为。)

对于奖励奇怪,当我运行以下代码时:

for my $val (qw/ one two three /) {
    for(open(my $fh, ">>", "test.txt")){
        print $fh "$val\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

它给了我以下输出:

one
two
three
Run Code Online (Sandbox Code Playgroud)

这段代码看起来应该与之前的代码在功能上相同。为什么它的行为不同?

perl

6
推荐指数
1
解决办法
148
查看次数

使用Perl/DBI在MySQL表中截断utf-8字符串

我试图使用perl/DBI将utf-8字符串写入MySQL表.由于某种原因,字符串在第一个非ascii字符处被截断.

例如,如果我设置下表:

CREATE DATABASE testdb DEFAULT CHARSET=utf8;
CREATE TABLE testdb.testtable (textval CHAR(30)) DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

然后运行以下perl代码:

#!/usr/bin/perl
use strict;
use DBI;
my $dbh = DBI->connect('DBI:mysql:host=localhost;database=testdb', 'testuser', 'somepassword', {mysql_enable_utf8 => 1}) or die $DBI::errstr;
$dbh->do('SET NAMES utf8');
$dbh->do("INSERT INTO testtable (textval) VALUES ('the N\xFCrburgring')");
Run Code Online (Sandbox Code Playgroud)

它实际上写的是"N".(什么时候应该写"纽伯格林")

查看MySQL查询日志,我看到:

271 Query INSERT INTO testtable (textval) VALUES ('the Nürburgring')
Run Code Online (Sandbox Code Playgroud)

所以字符串完整地到达DB服务器.

如果我直接在MySQL控制台中输入相同的查询:

INSERT INTO testtable (textval) VALUES ('the Nürburgring');
Run Code Online (Sandbox Code Playgroud)

整个字符串都正确写入.知道我做错了什么吗?

mysql perl utf-8 dbi

5
推荐指数
1
解决办法
1626
查看次数

从LWP获取原始响应标头?

有没有办法从LWP的HTTP请求中获取原始的,未修改的响应头?这适用于需要识别可能格式错误的标头问题的诊断工具.

我发现最接近的是:

use LWP::UserAgent;
my $ua = new LWP::UserAgent;
my $response = $ua->get("http://somedomain.com");
print $response->headers()->as_string();
Run Code Online (Sandbox Code Playgroud)

但这实际上解析了标题,然后从解析的数据中重构了它们的规范化,清理后的版本.我真的需要完整的服务器返回形式的整个标题文本,因此任何格式错误或非标准的标题都将清晰可辨.

如果事实证明LWP无法做到这一点,是否有其他Perl模块可以做到这一点?

perl lwp http-headers

3
推荐指数
1
解决办法
3989
查看次数

标签 统计

perl ×3

dbi ×1

http-headers ×1

lwp ×1

mysql ×1

utf-8 ×1