小编Sob*_*que的帖子

为什么XML ::简单劝阻?

来自以下文件XML::Simple:

不鼓励在新代码中使用此模块.其他模块可用,提供更直接和一致的接口.特别强烈建议使用XML :: LibXML.

该模块的主要问题是大量选项以及这些选项交互的任意方式 - 通常会产生意外结果.

有人可以为我澄清一下这主要原因是什么?

xml perl xml-simple

55
推荐指数
2
解决办法
1万
查看次数

perl中的"%_"是什么?

我刚给了一个代码片段:

@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)

%_似乎工作,虽然它似乎是全球范围.谁能指点我参考呢?(或者至少向我保证,做上述事情并不会破坏重要的东西!)

perl

28
推荐指数
1
解决办法
2144
查看次数

Perl的哪些功能使它成为一种函数式编程语言?

灵感来自: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::Utilreduce?)

我有人能帮我填补这里的空白吗?Perl可以轻松完成以上哪些操作(并且有一个简单的例子)并且有哪些例子可以解决它?

perl functional-programming

17
推荐指数
1
解决办法
4108
查看次数

rename()原子性和NFS?

参考:rename()是原子的吗?

我问的是类似的东西,但不完全一样,因为我想知道的是依赖于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)

linux nfs atomicity

10
推荐指数
3
解决办法
2662
查看次数

Perl在脚本中编辑(而不是一个衬垫)

所以,我习惯于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调整或类似)的"就地编辑". …

perl

9
推荐指数
1
解决办法
4575
查看次数

查找"丢失"变量(循环引用)

所以,这是一个简单的例子 - 但如果我设置这样的循环引用:

#!/usr/bin/perl
use strict;
use warnings;

{ 
   my $thing; 
   my $otherthing;
   $thing -> {otherthing} = \$otherthing;
   $otherthing -> {thing} = \$thing; 
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个内存泄漏 - 因为通过引用计数,这里分配的内存永远不会被释放,尽管没有任何外向的"访问点".

所以我想知道 - 在这种情况下,有什么方法可以 - 通过调试或类似方式 - '重新发现'这些变量并再次访问它们?

假设我正在考虑一个不那么简单的案例 - 你有一个记忆泄漏的对象,但是想再次"抓住"它以查看其中的内容,给出关于所述对象中的内容以及因此问题所在的提示开始了.

perl reference

8
推荐指数
1
解决办法
539
查看次数

文件路径转换为JSON数据结构

我正在做一个磁盘空间报告,用于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)

perl json

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

将一组父子关系转换为层次结构

我有一个我正在查询的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)

perl

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

如何将嵌套的for循环转换为perl中的多线程程序

我需要帮助将嵌套的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)

perl multithreading

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

使用XML :: Twig,有没有办法找到具有特定属性的'first_child'?

我有一些看起来像这样的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)

xml perl xml-twig

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