我在这里找到了在 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) 我想将行之间@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) 我非常非常喜欢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)
对于这也是相同的输出.它如何打印值.在那本书中,他们没有给出任何解释.我在互联网上搜索过.但我找不到任何东西.
如何使用$ _来存储我的字符串,然后使用另一个标量变量来存储替换字符串,以便我有两个副本.我们有一个修饰符来复制另一个变量中的默认参数吗?
#! /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) 如果我有逗号分隔的长度为10号的字符串(的文件0001010101为例),并想重新格式化字符串每个字符串的最后两个字符为字母,其中替代01是A,并依此类推,直到26被Z什么拍的方式做在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) 这段代码:
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) 我正在尝试在我的 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脚本,我使用的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) 假设我在文本文件中有这个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)
笔记:
问题与数据
\n这篇文章的底部是生成 NYTProf 数据的整个脚本。该脚本构建一个哈希,然后尝试删除包含某些错误模式的键。通过 NYTProf 运行代码会生成以下内容
\ndelete @$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\nRun Code Online (Sandbox Code Playgroud)\n对 main::CORE:match 和 main::CORE:regcomp 进行了超过 7,000 次调用。假设这是足以降低噪音水平的呼叫量。
\n继续!仅当坏模式出现在键的开头时才需要删除。听起来很棒!添加 ^ 来锚定正则表达式应该可以提高性能。然而,NYTProf 生成以下内容。NYTprof 已经运行了很多次,这是相当一致的
\ndelete @$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)