如何在不修改字符串本身的情况下在Perl中进行一行替换?我也希望它在表达式中可用,就像我p s.gsub(/from/, 'to')
在Ruby中可以做的那样.
我能想到的只是
do {my $r = $s; $r =~ s/from/to/; $r}
Run Code Online (Sandbox Code Playgroud)
但是肯定有更好的方法吗?
我想使用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
.
如何获取匿名列表的长度?
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) 伙计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和"你好"或你好做同样的工作为什么他们介绍"".我只是需要解释为什么它会发生在上面的代码上.
sub my_sub {
my $str = shift;
$str =~ s/some/regex/;
return $str;
}
Run Code Online (Sandbox Code Playgroud)
对于这样一个简单的子程序,五行似乎太长了.可以简化,例如不使用中间变量吗?
这个问题是关于要求对Perl系统中发生的事情进行一些解释,因为我现在编码的时间超过25年并没有隐含地看到这一点.故事来了......
在尝试使用Cyrus::IMAP::Admin
Perl5中的实例时,我试图获取并打印一个配额列表,导致返回一些奇怪的结构化数据.
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中编写了一个简单的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 $/;
在循环结束时作为单独的语句添加来修复,但我无法弄清楚为什么这是必要的.
我究竟做错了什么?
我正在尝试将数组分配给我的哈希值,如下所示:
$authors->[$x]->{'books'} = @books;
Run Code Online (Sandbox Code Playgroud)
$authors
是一个哈希数组,包含他/她的名字,姓氏,出生日期等.现在我正在创建一个books
键,我想分配一系列书籍.但是,当我尝试打印后,它只是打印数组的大小,就像我正在做的那样$value = scalar @books
.
我究竟做错了什么?
获取给定目录中所有文件(包括子目录中的文件)全名的最简单方法是什么?
是的,我了解File::Find
模块。但是,有没有更简单的方法?
其他哈希函数源代码包括多种哈希算法供您选择。尽管我们认为默认的perl哈希可以抵抗攻击,但是我们将哈希函数Siphash作为后备选项包括在内。在Perl 5.18.0发行时,Siphash被认为具有加密强度。这不是默认值,因为它比默认哈希值慢得多。
默认的perl哈希函数是什么?从上下文中我们可以推断出它不是SIPHASH吗?
有没有办法通过传递给另一个子程序的参数来选择子程序?像这样的东西:
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
等.除了那当然不起作用.
他们在评论中说,DBIx::Class
可以在不加载所有表格的情况下使用.
如何在DBIx::Class
不加载所有表的情况下使用?(出于性能原因,我需要这个.)
我正在更新数据库中的一些记录.并且所有处理都在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 ×13
perl5 ×13
arrays ×2
bash ×1
dbix-class ×1
dpkg ×1
fizzbuzz ×1
hash ×1
list ×1
perl5.30 ×1
regex ×1
scalar ×1
sigils ×1
subroutine ×1
substitution ×1