为什么以下 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/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)
整个字符串都正确写入.知道我做错了什么吗?
有没有办法从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模块可以做到这一点?