标签: perl5

在Perl中是否有类似的Ruby gsub方法?

可能重复:
如何在保留原始字符串的同时对字符串执行Perl替换?

如何在不修改字符串本身的情况下在Perl中进行一行替换?我也希望它在表达式中可用,就像我p s.gsub(/from/, 'to')在Ruby中可以做的那样.

我能想到的只是

do {my $r = $s; $r =~ s/from/to/; $r}
Run Code Online (Sandbox Code Playgroud)

但是肯定有更好的方法吗?

perl perl5

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

在嵌套的单引号,反引号和引用内逃脱美元符号

我想使用Perl在文件的每一行上运行shell命令.该文件包含诸如的包名firefox.

这是对单个包名称的调用; 有用:

dpkg-query -W -f='${binary:Package}_${Version}' firefox
Run Code Online (Sandbox Code Playgroud)

如果我从这样的单行"文件"管道它不再起作用:

echo firefox | perl -ne \
  'print `dpkg-query -W -f="${binary:Package}_${Version}" $_` . "\n"'
Run Code Online (Sandbox Code Playgroud)

输出是_\n.那么在这些嵌套引号中逃避这些美元的正确方法是什么,以便dpkg-query接收${binary:Package}_${Version}不带shell 的bba 或bash将它们解释为"他们的"变量的逐字字符串?我尝试了各种排列但到目前为止无济于事.输出应该是表格firefox_59.0.2+build1-0ubuntu0.16.04.1\n.

bash perl dpkg perl5

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

Perl:匿名列表的长度

如何获取匿名列表的长度?

perl -E 'say scalar ("a", "b");' # => b
Run Code Online (Sandbox Code Playgroud)

我希望scalar在标量上下文中返回列表-它的长度。

为什么返回第二个(最后一个)元素?

它适用于数组:

perl -E 'my @lst = ("a", "b"); say scalar @lst;' # => 2
Run Code Online (Sandbox Code Playgroud)

arrays perl scalar list perl5

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

"52"和52之间的区别?

伙计perl并不是那么容易我认为它是如此令人困惑的事情.我只是转移到操作员,我写了一些代码,但我无法弄清楚编译器如何处理它们.

$in = "42" ;

$out = "56"+32+"good";

print $out,;
Run Code Online (Sandbox Code Playgroud)

上面代码的输出是88,好消息在哪里?现在让我们看看另一个.

$in ="42";

$out="good52"+32;

print $out ;
Run Code Online (Sandbox Code Playgroud)

对于这些,输出是32.问题是我们刚存储在$ out中的好处在哪里,以及""为什么编译器只是将值打印为32而不是剩余的文本之间的值52.另一个问题是

$in=52;

$in="52"; 
Run Code Online (Sandbox Code Playgroud)

做同样的工作"52"不作为文本工作.因为当我们添加"52"+32时它会给出84.发生了什么和

$in = "hello";

$in = hello; 
Run Code Online (Sandbox Code Playgroud)

两者都做同样的工作?或者他们是否有所不同,但如果我打印然后给出相同的输出.它只是吃掉了我的大脑.它是如此令人困惑,因为当"52"或52和"你好"或你好做同样的工作为什么他们介绍"".我只是需要解释为什么它会发生在上面的代码上.

perl perl5

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

我应该如何缩短简单的替换子程序?

sub my_sub {
    my $str = shift;
    $str =~ s/some/regex/;
    return $str;
}
Run Code Online (Sandbox Code Playgroud)

对于这样一个简单的子程序,五行似乎太长了.可以简化,例如不使用中间变量吗?

regex perl substitution perl5

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

Perl 5中的数据访问不一致(愚蠢?)(也使我对使用sigils感到困惑)

这个问题是关于要求对Perl系统中发生的事情进行一些解释,因为我现在编码的时间超过25年并没有隐含地看到这一点.故事来了......

在尝试使用Cyrus::IMAP::AdminPerl5中的实例时,我试图获取并打印一个配额列表,导致返回一些奇怪的结构化数据.

my %quotas = $client->listquota(@list[0]);

if ( $client->error ) {
    printf STDERR "Error: " . $client->error . "\n";
    exit 1;
}

print "root: " . $list[0] . "\n";

foreach my $quota ( keys %quotas ) {
    print( $quota, " ", $quotas{$quota}[0], "/", $quotas{$quota}[1], " KiB\n" );
}
Run Code Online (Sandbox Code Playgroud)

这段代码实际上是通过打印出类似的东西来实现的

root: user.myuser
STORAGE: 123/4567 KiB
Run Code Online (Sandbox Code Playgroud)

此代码取自以下Cyrus::IMAP::Shell类似的读取:

my %quota = $$cyrref->listquota(@nargv);
foreach my $quota (keys %quota) {
    $lfh->[1]->print(" ", $quota, " ", $quota{$quota}[0], "/", $quota{$quota}[1]);
    if ($quota{$quota}[1]) { …
Run Code Online (Sandbox Code Playgroud)

perl sigils perl5

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

三元表达后连接换行符(Perl 5)

我刚刚在Perl中编写了一个简单的fizzbuzz程序:

#!/usr/bin/perl
for $a (1..100) {
  print ($a%15 ? ($a%3 ? ($a%5 ? $a : "buzz") : "fizz") : "fizzbuzz") . $/;
}
Run Code Online (Sandbox Code Playgroud)

它有点工作,但由于某种原因,我没有在输出中得到任何换行符:

12fizz4buzzfizz78fizzbuzz11fizz1314fizzbuzz1617fizz19buzzfizz2223fizzbuzz26...
Run Code Online (Sandbox Code Playgroud)

我知道这可以通过print $/;在循环结束时作为单独的语句添加来修复,但我无法弄清楚为什么这是必要的.

我究竟做错了什么?

perl concatenation fizzbuzz ternary-operator perl5

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

Perl - 将数组分配给另一个变量

我正在尝试将数组分配给我的哈希值,如下所示:

$authors->[$x]->{'books'} = @books;
Run Code Online (Sandbox Code Playgroud)

$authors是一个哈希数组,包含他/她的名字,姓氏,出生日期等.现在我正在创建一个books键,我想分配一系列书籍.但是,当我尝试打印后,它只是打印数组的大小,就像我正在做的那样$value = scalar @books.

我究竟做错了什么?

arrays perl hash perl5

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

获取目录中所有文件的名称列表(Perl)

获取给定目录中所有文件(包括子目录中的文件)全名的最简单方法是什么?

是的,我了解File::Find模块。但是,有没有更简单的方法?

perl directory-structure perl5

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

Perl的默认哈希实现是什么?

根据 perldoc perlsec

其他哈希函数源代码包括多种哈希算法供您选择。尽管我们认为默认的perl哈希可以抵抗攻击,但是我们将哈希函数Siphash作为后备选项包括在内。在Perl 5.18.0发行时,Siphash被认为具有加密强度。这不是默认值,因为它比默认哈希值慢得多

默认的perl哈希函数是什么?从上下文中我们可以推断出它不是SIPHASH吗?

perl hash-function perl5 perl5.30

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

将参数传递给子例程的名称

有没有办法通过传递给另一个子程序的参数来选择子程序?像这样的东西:

sub foo1 {
    # does stuff to @_
}

sub foo2 {
    # does other stuff to @_
}

sub foo3 {
    # does other stuff to @_
}

sub foo {
    my $whichsub = shift;
    my @fooed = foo.$whichsub @_;
    # does stuff to @fooed
}
Run Code Online (Sandbox Code Playgroud)

foo.$whichsub应该在哪里foo1等.除了那当然不起作用.

perl subroutine perl5

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

使用DBIx :: Class而不加载所有表

他们在评论中,DBIx::Class可以在不加载所有表格的情况下使用.

如何在DBIx::Class不加载所有表的情况下使用?(出于性能原因,我需要这个.)

perl dbix-class perl5

0
推荐指数
1
解决办法
52
查看次数

perl eval投掷空白例外

我正在更新数据库中的一些记录.并且所有处理都在eval块中完成.问题是即使记录成功更新,我仍然会看到异常被提出.

为了调试异常,我尝试使用Data Dumper打印它,但异常是空白的.

任何人都可以帮我确定这个错误是什么,为什么每次都抛出?

环境详细信息(Perl 5.8和Unix SUSE)

从数据转储器转储:

$VAR1 = '
';
Run Code Online (Sandbox Code Playgroud)

我正在使用各种内部API来更新这些记录..所以我修改了我的代码看起来类似:

      sub main{
        eval{
         DB->updateRecord($value)
        };
        if($@){
             Mail->SendMail(__PACKAGE__,$@):
        }
       }

       package DB;
       sub updateRecord{
             my ($self , $value) = @_;
             my $query = "update set column_value = $value ..<update query> ";
            API->processQuery($query );
        }
Run Code Online (Sandbox Code Playgroud)

perl exception-handling perl5

-1
推荐指数
1
解决办法
351
查看次数