来自以下文件XML::Simple:
不鼓励在新代码中使用此模块.其他模块可用,提供更直接和一致的接口.特别强烈建议使用XML :: LibXML.
该模块的主要问题是大量选项以及这些选项交互的任意方式 - 通常会产生意外结果.
有人可以为我澄清一下这主要原因是什么?
我刚给了一个代码片段:
@list = grep { !$_{$_}++ } @list;
Run Code Online (Sandbox Code Playgroud)
作为重复数据删除的习惯用语.它似乎工作,但 - 没有%_列出perlvar.
我通常会通过声明%seen例如:
my %seen; my @list = grep { not $seen{$_}++ } @list;
Run Code Online (Sandbox Code Playgroud)
但%_似乎工作,虽然它似乎是全球范围.谁能指点我参考呢?(或者至少向我保证,做上述事情并不会破坏重要的东西!)
灵感来自:https://stackoverflow.com/questions/30977789/why-is-c-not-a-functional-programming-language
我发现:高阶Perl
这让我对Perl是一种函数式编程语言的断言感到疑惑.现在,我欣赏函数式编程是一种技术(很像面向对象).
但是我找到了一个函数式编程语言的列表:
现在其中一些我很熟悉:
例如,垃圾收集是Perl引用计数,并在不再需要时释放内存.
词汇封闭甚至是FAQ的一部分:什么是封闭?- 这里可能有更好的文章:http://www.perl.com/pub/2002/05/29/closure.html
但是我开始对其中的一些感到有点模糊 - 例如列表理解 - 我认为这是指map/ grep(List::Util和reduce?)
我有人能帮我填补这里的空白吗?Perl可以轻松完成以上哪些操作(并且有一个简单的例子)并且有哪些例子可以解决它?
我问的是类似的东西,但不完全一样,因为我想知道的是依赖于rename()使用NFS时的原子性是否安全?
这是我正在处理的一个场景 - 我有一个必须始终存在的'索引'文件.
所以:
独立客户:
这假设rename()是原子意味着 - 总会有一个'索引'文件(尽管它可能是一个过时的版本,因为缓存和时间)
然而我遇到的问题是 - 这是在NFS上发生的 - 并且正在工作 - 但是我的几个NFS客户端偶尔会报告"ENOENT" - 没有这样的文件或目录.(例如,在以5米间隔发生的数百次操作中,我们每隔几天就会收到此错误).
所以我希望是否有人可以启发我 - 在这种情况下,实际上是否真的无法获得'ENOENT'?
我问的原因是RFC 3530中的这个条目:
RENAME操作必须是客户端的原子操作.
我想知道这是否只是发出重命名的客户端,而不是查看目录的客户端?(我对缓存/过时的目录结构没问题,但是这个操作的重点是这个文件总是以某种形式"存在")
操作顺序(来自执行写操作的客户端)是:
21401 14:58:11 open("fleeg.ext", O_RDWR|O_CREAT|O_EXCL, 0666) = -1 EEXIST (File exists) <0.000443>
21401 14:58:11 open("fleeg.ext", O_RDWR) = 3 <0.000547>
21401 14:58:11 fstat(3, {st_mode=S_IFREG|0600, st_size=572, ...}) = 0 <0.000012>
21401 14:58:11 fadvise64(3, 0, 572, POSIX_FADV_RANDOM) = 0 <0.000008> …Run Code Online (Sandbox Code Playgroud) 所以,我习惯于perl -i使用perl,因为我愿意sed和就地编辑.
$^Iin 的文档perlvar:
$ ^ I inplace-edit扩展的当前值.使用undef禁用就地编辑.
好.所以这意味着我可能会在脚本中进行"就地"编辑?
我遇到麻烦的是这样的:
如果我跑:
perl -pi -e 's/^/fish/' test_file
Run Code Online (Sandbox Code Playgroud)
然后解析它:
BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
s/^/fish/;
}
continue {
die "-p destination: $!\n" unless print $_;
}
Run Code Online (Sandbox Code Playgroud)
现在 - 如果我想要$^I在脚本中使用,请说:
foreach my $file ( glob "*.csv" ) {
#inplace edit these files - maybe using Text::CSV to manipulate?
}
Run Code Online (Sandbox Code Playgroud)
我如何"启用"这种情况发生?这是一个改变的问题$_(s/something/somethingelse/默认情况下),并让perl隐式打印出来吗?或者还有其他事情发生了吗?
我的主要问题是 - 我可以执行应用CSV转换(或XML调整或类似)的"就地编辑". …
所以,这是一个简单的例子 - 但如果我设置这样的循环引用:
#!/usr/bin/perl
use strict;
use warnings;
{
my $thing;
my $otherthing;
$thing -> {otherthing} = \$otherthing;
$otherthing -> {thing} = \$thing;
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个内存泄漏 - 因为通过引用计数,这里分配的内存永远不会被释放,尽管没有任何外向的"访问点".
所以我想知道 - 在这种情况下,有什么方法可以 - 通过调试或类似方式 - '重新发现'这些变量并再次访问它们?
假设我正在考虑一个不那么简单的案例 - 你有一个记忆泄漏的对象,但是想再次"抓住"它以查看其中的内容,给出关于所述对象中的内容以及因此问题所在的提示开始了.
我正在做一个磁盘空间报告,用于File::Find收集目录树中的累积大小.
我(轻松)得到的File::Find是目录名称.
例如:
/path/to/user/username/subdir/anothersubdir/etc
Run Code Online (Sandbox Code Playgroud)
我正在File::Find收集以下尺寸:
/path/to/user/username
Run Code Online (Sandbox Code Playgroud)
并构建目录和每个子目录的累积大小报告.
我目前得到的是:
while ( $dir_tree ) {
%results{$dir_tree} += $blocks * $block_size;
my @path_arr = split ( "/", $dir_tree );
pop ( @path_arr );
$dir_tree = join ( "/", @path_arr );
}
Run Code Online (Sandbox Code Playgroud)
(是的,我知道这不是很好.)
这样做的目的是当我stat每个文件时,我将它的大小添加到当前节点和树中的每个父节点.
这足以生成:
username,300M
username/documents,150M
username/documents/excel,50M
username/documents/word,40M
username/work,70M
username/fish,50M,
username/some_other_stuff,30M
Run Code Online (Sandbox Code Playgroud)
但我现在想把它变成JSON更像这样:
{
"name" : "username",
"size" : "307200",
"children" : [
{
"name" : "documents",
"size" : "153750",
"children" : [
{
"name" : …Run Code Online (Sandbox Code Playgroud) 我有一个我正在查询的LDAP目录Net::LDAP.这给了我一组亲子关系.
它是一个人的目录 - 并包括一个'经理'DN(这是目录中的另一个字段).
我真的很难将这个经理 - >人员记录集转换为层次结构.
到目前为止我得到的是:
#!/usr/bin/env perl
use strict;
use warnings;
use Net::LDAP;
use Data::Dumper;
my %people;
my $ldap = Net::LDAP->new('my_ldap_server');
my $result = $ldap->bind('bind_dn');
die if $result->code;
my $search = $ldap->search(
base => 'ou=yaddayadda',
scope => 'subtree',
filter => 'objectClass=person',
attrs => ['manager'],
);
foreach my $found ( $search->entries ) {
my $mgr = $found->get_value('manager');
my $dn = $result->dn;
push( @{ $people{$mgr} }, $dn );
}
Run Code Online (Sandbox Code Playgroud)
这给我的是管理者和为他们工作的人(使用DN,这是独一无二的).
一个条目%people看起来像:
$VAR1 = {
'cn=Firstname …Run Code Online (Sandbox Code Playgroud) 我需要帮助将嵌套的for循环转换为Perl中的多线程程序,例如
for ( my $i=0; $i<100; $i++) {
for ( my $j=0; $j<100; $j++ ) {
for ( my $k=0; $k<100; $k++ ) {
#do something ....
}
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法我可以分割第一个循环如下并行并行运行它们
#Job1:
for ( my $i=0; $i < 40; $i++) {
for( my $j=0; $j < 100; $j++) {
for( my $k=0; $k < 100; $k++) {
#do something ....
}
}
}
#Job2:
for ( my $i=40; $i < 80; $i++) {
for( my $j=0; $j<100; $j++) {
for( …Run Code Online (Sandbox Code Playgroud) 我有一些看起来像这样的XML:
<?xml version="1.0" encoding="UTF-8"?>
<DataSet>
<Category>
<Name mode="source">somename</Name>
<Name mode="destination">someothername</Name>
<Content>Some text here</Content>
</Category>
</DataSet>
Run Code Online (Sandbox Code Playgroud)
我要做的是处理'类别',并根据上下文提取不同的名称.
我试过迭代它children- 这工作:
use strict;
use warnings;
use XML::Twig;
sub process_category {
my ( $twig, $category ) = @_;
my $cat_name;
foreach my $name ( $category->children('Name') ) {
if ( $name->att('mode') eq 'source' ) {
$cat_name = $name->text;
}
}
print "$cat_name ", $category->first_child_text('Content'), "\n";
}
my $twig =
XML::Twig->new( twig_handlers => { 'Category' => \&process_category } )
->parse( \*DATA );
__DATA__
<?xml …Run Code Online (Sandbox Code Playgroud)