小编zdi*_*dim的帖子

如何在不禁用严格的“引用”的情况下重命名 perl __ANON__ sub?

我在这里找到了在 Perl 中重命名匿名订阅者的解决方案。它涉及临时修改符号表以插入所需的名称。此解决方案使用要替换的硬编码符号表名称。我的问题是我想在运行时动态选择符号表名称。像这样的东西:

   $pkg = 'MyPkg::ModA::';
   $name = 'subname';
   ...
   no strict 'refs';
   local *{"${pkg}__ANON__"} = "$name [anon]";
   strict refs;
Run Code Online (Sandbox Code Playgroud)

使其工作的唯一方法是禁用严格引用。如果它们未被禁用,脚本将失败并显示以下消息:

不能使用字符串 ("MyPkg::ModA::__ANON__") 作为符号引用,而在 /path/to/source/File.pm 行 xx 处使用“严格引用”

请注意,可以使用等效语句

   local ${$pkg}{__ANON__} = "$name [anon]";
Run Code Online (Sandbox Code Playgroud)

带有类似的错误消息:

不能使用字符串 ("MyPkg::ModA::") 作为 HASH 引用,而在 /path/to/source/File.pm 行 xx 处使用“严格引用”

是否可以在不禁用严格引用的情况下做同样的事情?

TMI/DNR:
如果您感兴趣,这里有一个完整的示例。具有讽刺意味的是,我的解决方案使用匿名子重命名给定的匿名子。

ModA.pm

package MyPkg::ModA;

use strict;
use warnings;
use MyPkg::Util;

# Create a new instance.
sub new
{
   my ($type, $class, $self);

   # allow for both ModA::new and $moda->new
   $type = shift; …
Run Code Online (Sandbox Code Playgroud)

perl reference strict anonymous-function symbol-table

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

如何在两个图案之间打印线条?

我想将行之间@cluster t.# has ### elements(包括此行)之间的所有内容打印出来,并@cluster t.#+1 has ### elements(最好省略此行)从我的输入文件打印到相应编号的输出文件(clust(#).txt)中。到目前为止,该脚本创建了没有任何内容的适当编号的文件。

#!/usr/bin/perl 

use strict;
use warnings;

open(IN,$ARGV[0]);

our $num = 0;

while(my $line = <IN>) {
    if ($line =~ /^\@cluster t has (\d+) elements/) {
        my $clust = "full";
        open (OUT, ">clust$clust.txt");

    } elsif ($line =~ m/^\@cluster t.(\d+.*) has (\d+) elements/) {
        my $clust = $1;
        $num++;
        open (OUT, ">clust$clust.txt");
        print OUT, $_ if (/$line/ ... /$line/);
    }
}
Run Code Online (Sandbox Code Playgroud)

regex string perl

4
推荐指数
2
解决办法
3093
查看次数

如何在foreach声明中打印出这些值?

我非常非常喜欢perl编程.

在阅读循环时,对于foreach循环,我有两个例子.

一个例子是,

foreach ('hickory','dickory','doc') {
   print $_;
   print "\n";
}
Run Code Online (Sandbox Code Playgroud)

输出: -

hickory
dickory
doc
Run Code Online (Sandbox Code Playgroud)

$ _变量包含每个项目.所以,它打印.

在另一个例子中,他们说没有在print语句中指定$ _变量.只有那里的空打印声明.它如何打印foreach参数.

foreach ('hickory','dickory','doc') {
   print;
   print "\n";
}
Run Code Online (Sandbox Code Playgroud)

输出: -

hickory
dickory
doc
Run Code Online (Sandbox Code Playgroud)

对于这也是相同的输出.它如何打印值.在那本书中,他们没有给出任何解释.我在互联网上搜索过.但我找不到任何东西.

perl foreach

4
推荐指数
1
解决办法
391
查看次数

替换并存储在另一个标量中

如何使用$ _来存储我的字符串,然后使用另一个标量变量来存储替换字符串,以便我有两个副本.我们有一个修饰符来复制另一个变量中的默认参数吗?

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

$_ = "X is a good boy. X works daily and goes to school. X studies for 12 hours daily \n";

s/X/Sam/g;
print $_, "\n";
Run Code Online (Sandbox Code Playgroud)

我最终想要的是原始的$ _和替换的字符串.

编辑:我用过

my $new = s/X/Sam/gr
Run Code Online (Sandbox Code Playgroud)

但是我得到了与构建相关的错误,并没有解决问题.我使用的是5.10.1版

perl --version

This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi
Run Code Online (Sandbox Code Playgroud)

regex perl

4
推荐指数
1
解决办法
255
查看次数

在Perl中用逗号分隔的列表替换字符串的一部分

如果我有逗号分隔的长度为10号的字符串(的文件0001010101为例),并想重新格式化字符串每个字符串的最后两个字符为字母,其中替代01A,并依此类推,直到26Z什么拍的方式做在Perl?

示例文件内容:

0109150103,1807111225,0305102306
Run Code Online (Sandbox Code Playgroud)

输出将是:

01091501C,18071112Y,03051023F
Run Code Online (Sandbox Code Playgroud)

假设我将字符串拆分为数组,然后评估每个数字以查看带有substr的最后2位数字并替换为相应的字母.想知道什么是最有效的方法来做这个副看看是否01然后设置A,等等.

我会做的蛮力方式如下:

$data=<file.txt>;
@tokens=split /,/,$data;
while(@tokens)
{
 print substr($_,0,7)."A," if(substr($_,8,2)=='01');
 print substr($_,0,7)."B," if(substr($_,8,2)=='02');
#.
#.
 print substr($_,0,7)."Z," if(substr($_,8,2)=='26');
}
Run Code Online (Sandbox Code Playgroud)

string perl

4
推荐指数
1
解决办法
95
查看次数

使用Perl发布匹配的重音字符

这段代码:

perl -pe 's/^(\D\w+ \w+)( word )/\1;word/gi'
Run Code Online (Sandbox Code Playgroud)

当输入包含带有重音或特殊字符的单词时,此命令将不起作用: a?, ?.

规定:

我有这段代码可以统计唯一的艺术家文件。

find /PATH/ -type f -exec basename "{}" + 2>/dev/null |

perl -pe 's/ - .*//g' | LC_ALL=C  sort -f | uniq -c -i|

gsed -e 's/$/;/'|

awk '{numero=$1;$1=""}{print $0,numero}'|

perl -pe 's/^(\D\w+ \w+)( & )/\1;&/g' | 
perl -pe 's/^(\D\w+ \w+ \w+)( & >)/\1;&/g' | 
perl -pe 's/^(\D\w+ \w+ \w+ \w+)( & )/\1;&/g' | 
perl -pe >'s/^(\D\w+ \w+ \w+ \w+ \w+)( & )/\1;&/g' |

perl -pe 's/^(\D\w+ \w+)( Con …
Run Code Online (Sandbox Code Playgroud)

regex unicode perl utf-8

4
推荐指数
1
解决办法
140
查看次数

Perl:是否可以撤消 SIG{INT} 捕获?

我正在尝试在我的 Perl 程序中添加一个捕获信号。当 ctrl+C 发生时,我想要一条确认消息和一个用户输入( Y 或 N )。Y 输入工作正常。

如果用户输入 N,那么基本上我想“取消” ctrl+C 命令并返回到脚本。

编码:

$SIG{INT} = \&catchSignal;
$SIG{TERM} = \&catchSignal;

sub catchSignal
{
   my $ans;
   print " Are you sure you want to quit? Y or N:\n";
   $ans = <STDIN>;

   chomp $ans;

   if( $ans eq "Y" )
   {
      exit;
   }
   else
   {
      # Cancel the ctrl+C command
   }

}
Run Code Online (Sandbox Code Playgroud)

这样的事情可能吗?

perl signals

4
推荐指数
1
解决办法
142
查看次数

定义了一些字符串值(“0”、“”和“”),但是 (==undef)

在我的Perl脚本,我使用的if ($a == undef)情况下,我认为这是一样的if (not defined $a),这里$a是从一个CSV文件中读取一个字符串。但是,我注意到定义了几个字符串值("", " ", "0", "-0", "+0", "@", "a",以及许多其他空格和特殊字符),但也定义了undef. 如果undef只对数值,应该能顺利通过"0""+0""-0"。谁能解释一下?我现在明白我不应该用if ($a == undef)来替换if (not defined $a).

我的测试代码是:

@a_array = ("-1", "-0", "0", "+0", "1", "", " ", "@", "a", "\$", "-");
undef $a;
test_a();

foreach $a (@a_array) {
    $len_a = length($a);
    test_a();
}

sub test_a {
    if (defined $a) { print "a = …
Run Code Online (Sandbox Code Playgroud)

perl undef

4
推荐指数
1
解决办法
70
查看次数

如何递归搜索 JSON 文件以查找与给定模式匹配的所有节点,并将 JSON 'path' 返回到该节点及其值?

假设我在文本文件中有这个JSON:

{"widget": {
    "debug": "on",
    "window": {
        "title": "Sample Konfabulator Widget",
        "name": "main_window",
        "width": 500,
        "height": 500
    },
    "image": { 
        "src": "Images/Sun.png",
        "name": "sun1",
        "hOffset": 250,
        "vOffset": 250,
        "alignment": "center"
    },
    "text": {
        "data": "Click Here",
        "size": 36,
        "style": "bold",
        "name": "text1",
        "hOffset": 250,
        "vOffset": 100,
        "alignment": "center",
        "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
    }
}}
Run Code Online (Sandbox Code Playgroud)

使用 Perl,我已将文件读入$json_obj使用 JSON::XS调用的 JSON 对象。

如何搜索$json_obj所有调用的节点name并返回/打印以下作为结果/输出:

widget->window->name: main_window
widget->image->name: sun1
widget->text->name: text1
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 与搜索词匹配的节点名称可以出现在树的 …

perl json data-structures

4
推荐指数
2
解决办法
93
查看次数

Perl 锚定正则表达式性能

问题与数据

\n

这篇文章的底部是生成 NYTProf 数据的整个脚本。该脚本构建一个哈希,然后尝试删除包含某些错误模式的键。通过 NYTProf 运行代码会生成以下内容

\n
delete @$hash{ grep { /\\Q$bad_pattern\\E/ } sort keys %$hash };\n# spent  7.29ms making    2 calls to main::CORE:sort, avg 3.64ms/call\n# spent   808\xc2\xb5s making 7552 calls to main::CORE:match, avg 107ns/call\n# spent   806\xc2\xb5s making 7552 calls to main::CORE:regcomp, avg 107ns/call\n
Run Code Online (Sandbox Code Playgroud)\n

对 main::CORE:match 和 main::CORE:regcomp 进行了超过 7,000 次调用。假设这是足以降低噪音水平的呼叫量。

\n

继续!仅当坏模式出现在键的开头时才需要删除。听起来很棒!添加 ^ 来锚定正则表达式应该可以提高性能。然而,NYTProf 生成以下内容。NYTprof 已经运行了很多次,这是相当一致的

\n
delete @$hash{ grep { /^\\Q$bad_pattern\\E/ } sort keys %$hash };\n# spent  7.34ms making    2 calls to main::CORE:sort, avg 3.67ms/call\n# spent …
Run Code Online (Sandbox Code Playgroud)

regex perl performance profiling

4
推荐指数
2
解决办法
148
查看次数