Perl的文档说$/
:
输入记录分隔符,默认为换行符.这影响了Perl关于"线"是什么的想法.
那么,基本上是错误的:
print STDERR $var, $/;
Run Code Online (Sandbox Code Playgroud)
代替:
print STDERR "$var\n";
Run Code Online (Sandbox Code Playgroud)
?
如果我做前者会出现什么问题?
如何将下一个搜索位置的开头倒数1?例如,假设我想匹配之间的所有数字#
.以下将只给我奇数.
my $data="#1#2#3#4#";
while ( $data =~ /#(\d)#/g ) {
print $1, "\n";
}
Run Code Online (Sandbox Code Playgroud)
但是如果我能够将下一个位置的开始倒数1,我会得到偶数和奇数.
这不起作用: pos() = pos() - 1;
我知道我可以用它完成这个任务split
.但这不能回答我的问题.
for (split /#/, $data) {
print $_, "\n";
}
Run Code Online (Sandbox Code Playgroud) 什么字符类或Unicode属性将匹配Perl 中的任何Unicode元音?
错误答案:[aeiouAEIOU]
.(这里的讲道,洗衣清单中的第24项)
perluniprops仅为Hangul和印度语脚本提及元音.
让我们抛开一个元音是什么的问题.是的,i
在某些情况下可能不是元音.所以,任何可以作为元音的角色都可以.
\s
用于空格的Perl(<v5.18)正则表达式字符类与[\t\n\f\r ]
.
现在,由于某些文件名使用下划线作为空格,我想知道是否可以重新定义\s
(本地)以匹配除空格之外的下划线.
这仅仅是为了具有许多其他复杂的正则表达式的可读性[\s_]
.我可以这样做吗?如果是这样,怎么样?
chomp
似乎能够改变未通过引用传递的变量的值; 也就是说,语法chomp $var
代替chomp \$var
.
这怎么可能?我怎样才能在函数中模仿这种行为?
chomp
:
my $var="foo\n";
chomp $var;
print $var
Run Code Online (Sandbox Code Playgroud)
mychomp
:
my $var="foo\n";
mychomp(\$var);
print $var;
sub mychomp {
my $ref=shift;
$$ref=~s/\s+$//;
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个hOCR::Element
包HTML::Element
来处理hOCR内容.因此,hOCR::Element
该类中的对象继承了属于的所有方法HTML::Element
.
但是由于有许多基本方法HTML::Element
(例如find_by_tag_name
和look_down
)返回HTML::Element
对象,我认为自己必须为每个这样的方法编写一个相应的hOCR::Element
包装方法,它只是按照hOCR
给出的方式将祝福映射为HTML
.
例如:
package hOCR::Element;
use HTML::Element;
use parent 'HTML::Element';
sub new {
my ($class, %params) = @_;
my $self = $class->SUPER::new (%params);
return bless $self, $class;
}
sub look_down {
my $self = shift;
return map { bless $_, 'hOCR::Element' } $self->SUPER::look_down (@_);
}
1;
Run Code Online (Sandbox Code Playgroud)
我怎样才能让子类继承其基类中的所有方法,使得这些相关方法返回子类对象而不是基类对象,而不必为每个这样的父方法编写包装器?
我正在寻找一种计算成本较低的方法来访问子例程返回的列表的最后一项(而不修改子例程本身)。
正如我所看到的,我在下面所做的实际上是将返回的列表复制到命名数组@list
或匿名数组中[]
,然后访问该数组的最后一个值,而不是直接访问返回列表的最后一项。
这里有什么捷径吗?如何直接访问返回列表的最后一项?
sub range { return 0 .. 10**7 }
Run Code Online (Sandbox Code Playgroud)
根据 GNU ,这需要 0.808 秒的用户时间time
:
my @array = range();
print pop @array;
Run Code Online (Sandbox Code Playgroud)
这里是 0.792 秒:
my @array = range();
print $array[$#array], "\n"
Run Code Online (Sandbox Code Playgroud)
0.680 秒:
print pop [ range() ]
Run Code Online (Sandbox Code Playgroud) 我写了一个Perl脚本,打印出与Unicode属性匹配的字符.到目前为止,它似乎适用于大多数房产.
但它打印出ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ
ÿ
匹配的字符[^\w]
.这些字符应该匹配\w
.奇怪的是,他们匹配\p{Word}
.
我试过没有成功:
map { decode ( "UTF-8", $_ ) }
map { pack 'U0C*', unpack 'C*', $_ }
如何使[^\w]
这些单词字符不匹配?
#!/usr/bin/perl
use warnings;
use strict;
use utf8;
binmode STDOUT, ':utf8';
my $c;
my $cols = 80;
my $arg = shift;
my $regex = qr/$arg/;
for ( map { chr } 0x20 .. 0xFFFF )
{
next if /\p{Unassigned}|\p{NChar}|\p{Cs}/;
if ( $_ =~ $regex )
{
print STDOUT;
print …
Run Code Online (Sandbox Code Playgroud) 为什么 Perl(5.30.3 以及no feature ':all'
)假定连接运算符后面的裸字.
是字符串?例如:
use v5.30; # or: no feature ':all';
use strict;
use warnings;
my $k1 = 'a';
my $k2 = 'b';
print STDOUT $k1 . k2 . "\n";
Run Code Online (Sandbox Code Playgroud)
打印出来ak2
(ab
是有意的),并且不会引发此处不允许使用裸字的例外情况。这是我的脚本中的一个错误,但不一定是 Perl 中的错误。
根据perlglossary
,裸词是指“根据 ,其含义足够模糊,被视为非法的词use strict 'subs'
”。然而,由于$k2
之前定义了一个名为 name 的标量k2
,所以我认为k2
它已经足够模糊了。
奇怪的是,第二个裸字引发了异常:
use v5.30; # or: no feature ':all';
use strict;
use warnings;
my $k1 = 'a';
my $k2 = 'b';
my $k3 …
Run Code Online (Sandbox Code Playgroud)