我想用另一个字符串替换字符串 - 问题是我需要原始案例保持原样.如果字符串以大写字母开头,我希望替换也以大写字母开头.所以我尝试了这个:
$text =~s/\b(Abc|abc)\b/(Xyz|xyz)/g;
Run Code Online (Sandbox Code Playgroud)
但它用"(Xyz | xyz)"替换"Abc"或"abc"的每个匹配.所以我猜测在更换中使用管道是不可能的?
我也试过以下,它完全正常:
$text =~s/\bAbc\b/Xyz/g;
$text =~s/\babc\b/abc/g;
Run Code Online (Sandbox Code Playgroud)
...但我真的希望我只用一行代码才能做到这一点.如果在一个正则表达式中不可能有两个替换,有没有其他方法来保留字符串的原始情况?
Date::Simple对象显示此行为,$date++返回第二天的日期.
Date ::简单对象是不可变的.将$ date1分配给$ date2后,$ date1的更改不会影响$ date2.这意味着,例如,没有像set_year操作,$ date ++将新对象分配给$ date.
如何自定义对象的前/后增量行为,以便执行++$object或$object--执行特定操作?
我已经浏览了perlboot,perltoot,perltooc和perlbot,但我没有看到任何显示如何做到这一点的例子.
这个问题来自于需要确保我对代码所做的更改不会影响它输出到文本文件的值.理想情况下,我会滚动一个子来接收两个文件名,return 1或者return 0取决于内容是否相同,空格和所有内容.
鉴于文本处理是Perl的强项,比较两个文件并确定它们是否相同(代码低于未经测试)应该非常容易.
use strict;
use warnings;
sub files_match {
my ( $fileA, $fileB ) = @_;
open my $file1, '<', $fileA;
open my $file2, '<', $fileB;
while (my $lineA = <$file1>) {
next if $lineA eq <$file2>;
return 0 and last;
}
return 1;
}
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一方法(没有CPAN模块)是打开有问题的两个文件,并逐行读取它们直到找到差异.如果没有找到差异,则文件必须相同.
但这种方法有限且笨拙.如果两个文件中的总行数不同怎么办?我应该打开和关闭以确定行数,然后重新打开以扫描文本?呸.
我没有看到perlfaq5中与此有关的任何内容.我希望远离模块,除非它们带有核心Perl 5.6.1发行版.
每当我看到术语源过滤器时,我都会想知道它的含义.
除了正式的定义之外,我认为一个例子也有助于将消息传递回家.
是否可以foreach在Perl中使用单行循环?
$hash{$thing}++ foreach my $thing (@things);
Run Code Online (Sandbox Code Playgroud)
我知道这可能与许多其他命令,如,
die "Invalid file!\n" if (open($Handle, "file.txt"));
Run Code Online (Sandbox Code Playgroud)
我知道开放的声明可能会破坏:)
我有兴趣了解更多有关Perl执行的幕后优化的信息.
一个例子是优化器将其reverse sort { $a <=> $b } @array;视为sort { $b <=> $a } @array;
它看起来很好' 在这个问题上没有任何东西.perldoc
这里有几个问题:
在没有的情况下perldoc,了解这种优化的官方资源是什么?
有没有理由perldoc不记录这些优化?
还有哪些其他众所周知的优化?
我有一个组合学问题,我希望能够在0和一个大整数之间随机选择一个整数.
现在对于常规整数,我通常会写一些类似的东西int rand 500;并完成它.
但对于大整数来说,它看起来rand并不适合这个.
使用以下代码,我运行了200万次调用的模拟rand $bigint:
$ perl -Mbigint -E 'say int rand 1230138339199329632554990773929330319360000000 for 1 .. 2e6' > rand.txt
Run Code Online (Sandbox Code Playgroud)
结果集的分布远非理想:
因此,该过程永远无法选择一个类似的数字999,或者5e+020,这使得这种方法不适合我想要做的事情.
看起来这与任意精度有关rand,在测试过程中它永远不会超过15位数:
$ perl -E 'printf "%.66g", rand'
0.307037353515625
Run Code Online (Sandbox Code Playgroud)
我最初的想法是,可能有一种方法可以影响精度rand,但感觉就像是一个更大问题的创可贴(即无法rand处理大整数).
无论如何,我希望有人之前走过这条路,并知道如何纠正这种情况.
我如何调整这个以使用localtime获取昨天的日期?
use strict;
sub spGetCurrentDateTime;
print spGetCurrentDateTime;
sub spGetCurrentDateTime {
my ($sec, $min, $hour, $mday, $mon, $year) = localtime();
my @abbr = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
my $currentDateTime = sprintf "%s %02d %4d", $abbr[$mon], $mday, $year+1900; #Returns => 'Aug 17 2010'
return $currentDateTime;
}
Run Code Online (Sandbox Code Playgroud)
〜
除了双关语之外,我正在尝试import在我的Perl类中实现一个方法来实例化一个Data对象,该对象本质上是一个美化的hashrefs数组,来自一个正确的hashrefs数组.
以下是我计划如何使用它的示例:
# Pull in the data
my $data = Data->import(
[
{ a => 1, b => 7, c => 3},
{ a => 7, b => 9, c => 2},
]
);
$data->manipulate; # Use package methods
Run Code Online (Sandbox Code Playgroud)
我的import实现如下:
package Data;
sub initialize {
my $class = shift;
my $data = [];
bless $data, $class;
return $data;
}
sub import {
my ( $class, $data ) = @_;
bless $data, $class;
return $data; …Run Code Online (Sandbox Code Playgroud) 我想抑制在DOS下运行的脚本的输出,类似于*nix环境下的以下内容:
$ command 1>/dev/null
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?