小编U. *_*ndl的帖子

Perl 条件(三元)运算符不执行快捷方式计算

条件(三元)运算符表明三元运算符是if...的替代品else。我一直这么认为,但最近我有一个逻辑问题。

考虑这个简短的调试会话:

  DB<1> $s='X'

  DB<2>  1 ? $s .= '_' : $s = '_'

  DB<3> x $s
0  '_'
Run Code Online (Sandbox Code Playgroud)

因此,如果为 true,则应该计算1表达式(而不是)。$s .= '_'$s = '_'

但为什么$s只是'_'最后呢?

perl conditional-operator

28
推荐指数
3
解决办法
2402
查看次数

对齐图中的文本

我是R新手并且有一个问题.我试图将一些文本放入R图中.这是使用UsingR包中的亮度数据集的一些代码.

    library(UsingR)
    brightness

    MyMean <- mean(brightness)
    MyMedian <- median(brightness)
    MySd <- sd(brightness)

    hist(brightness, breaks=35, main="This is a Histogram", 
         xlab="Brightness", ylab="Frequency", xlim=c(0,15), ylim=c(0, 200))

    text(3.5, 150, paste("Mean =", round(MyMean, 1), "\n Median =", 
         round(MyMedian, 1), "\n Std.Dev =", round(MySd, 1)))
Run Code Online (Sandbox Code Playgroud)

此代码生成:

在此输入图像描述

此输出的问题是文本未左对齐.有谁知道如何使文本保持对齐.

谢谢.

text r text-alignment

24
推荐指数
2
解决办法
6万
查看次数

如何在Java中将十六进制字符串转换为字节值

我有一个String数组.我想将其转换为字节数组.我使用Java程序.例如:

String str[] = {"aa", "55"};
Run Code Online (Sandbox Code Playgroud)

转换成:

byte new[] = {(byte)0xaa, (byte)0x55};
Run Code Online (Sandbox Code Playgroud)

我能做什么?

java hex byte

22
推荐指数
4
解决办法
15万
查看次数

为什么这个makefile在'make clean'上执行目标

这是我目前的makefile.

CXX      = g++
CXXFLAGS = -Wall -O3
LDFLAGS  =

TARGET = testcpp
SRCS   = main.cpp object.cpp foo.cpp
OBJS   = $(SRCS:.cpp=.o)
DEPS   = $(SRCS:.cpp=.d)


.PHONY: clean all

all: $(TARGET)

$(TARGET): $(OBJS)
    $(CXX) $(CXXFLAGS) $(LDFLAGS) $(OBJS) -o $(TARGET)

.cpp.o:
    $(CXX) $(CXXFLAGS) -c $< -o $@

%.d: %.cpp
    $(CXX) -M $(CXXFLAGS) $< > $@

clean:
    rm -f $(OBJS) $(DEPS) $(TARGET)

-include $(DEPS)
Run Code Online (Sandbox Code Playgroud)

它有一个例外,完美地工作.如果目录已经是干净的(没有*.d,*.o)并且我运行'make clean',它会重新创建依赖项,然后立即删除它们:

[user@server proj]$ make
g++ -M -Wall -O3 foo.cpp > foo.d
g++ -M -Wall -O3 object.cpp > object.d
g++ …
Run Code Online (Sandbox Code Playgroud)

c c++ dependencies makefile gnu-make

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

提取R中字符向量中的所有最大长度值

我已经创建了一个函数,它基本上输出多个长度字符串,例如,

"110110" "110"    "101"    "011" 
Run Code Online (Sandbox Code Playgroud)

现在,我在变量a中分配了函数的输出,

a<- c("110110", "110",   "101",    "011")
Run Code Online (Sandbox Code Playgroud)

a的类出来是个性.现在,我只想要那些具有最大长度的字符串.例如,在该示例中,最大长度为"110110".所以,我想要那个.我尝试使用max命令,但如果有多个,则只返回一个最大长度字符串.例如,在这些字符串中,

a <- c("110", "101", "abc", "cab")
Run Code Online (Sandbox Code Playgroud)

使用max命令仅返回"cab".但是,我想要所有最大长度的字符串.我该怎么做?

string select r max

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

`/regex/o` 的真正含义是什么(曾经有过一次,但现在似乎消失了)?

(抱歉这个标题,但是这个“功能”确实让我困惑)

在学习 Perl 时,我了解到o使用变量的正则表达式的修饰符只会被评估一次,即使变量在初始评估后发生变化。最初看起来没有任何问题,这是明确指定的。

显然,在所使用的变量获得其值之前不能进行初始评估。

现在qr让生活变得更有趣了。考虑以下代码(也在定义其他变量的循环中执行):

{
    my $n = $name;
    $n =~ s/[^\w\.-]/_/g;
    $n = qr:^${n}\@${another_variable}$:o;
    @a = grep { !/$n/ } @a;
}
Run Code Online (Sandbox Code Playgroud)

当直接使用正则表达式时qr,人们可能会争辩说正则表达式只编译一次,即使变量的范围超出范围(超出范围是否被视为变量的更改?)

但是当使用qr构建正则表达式并将其分配给词法变量时,编译的正则表达式将超出范围,因此我期望正则表达式不能重用并且将被重新构建(基本思想是内部的正则表达式grep应该不必为每次迭代而重建)。

由于生活是残酷的,似乎引用的整个正则表达式$n从未被重建,因此使用第一个值直到程序停止。

有趣的是,在 Perl 5.18.2(正在使用的版本)中不再提及修饰符operlre(1)而 Perl 5.26.1 在相应的页面中说:

o - 假装优化你的代码,但实际上引入了错误

那么任何人都可以解释“一次”评估的规则(以及语义在 Perl 的生命周期中是否发生了变化)?

有关的:

regex perl lazy-evaluation

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

如何在Perl中实现断言?

当试图assert()在Perl中实现C的宏时,存在一些基本问题.首先考虑以下代码:

sub assert($$) {
   my ($assertion, $failure_msg) = @_;
   die $failure_msg unless $assertion;
}

# ...
assert($boolean, $message);
Run Code Online (Sandbox Code Playgroud)

虽然这有效,但它不像C:在C中我会写assert($foo <= $bar),但有了这个实现,我必须写assert($foo <= $bar, '$foo <= $bar'),即重复条件为字符串.

现在我想知道如何有效地实现这一点.easy变量似乎将字符串传递给assert()并用于eval计算字符串,但在评估eval时无法访问变量.即使它可以工作,每次解析和评估条件也会非常低效.

传递表达式时,我不知道如何从中创建一个字符串,特别是在它已经被评估时.

另一个使用assert(sub { $condition })代码ref更容易制作字符串的变体被认为太难看了.

构造assert(sub { (eval $_[0], $_[0]) }->("condition"));

sub assert($)
{
    die "Assertion failed: $_[1]\n" unless $_[0];
}
Run Code Online (Sandbox Code Playgroud)

会怎么做,但打电话很难看.我正在寻找的解决方案编写条件检查一次,同时能够重现原始(未评估)条件有效地评估条件.

那么更优雅的解决方案是什么?显然,如果Perl有一个宏或类似的语法机制允许在编译或评估之前转换输入,那么解决方案会更容易.

perl assert eval

7
推荐指数
3
解决办法
323
查看次数

为什么 `splice(@_, 0, shift)` 是安全的?

Perl 5.18.2 文档splice有这个例子:

\n
my(@a) = splice(@_,0,shift);\nmy(@b) = splice(@_,0,shift);\n
Run Code Online (Sandbox Code Playgroud)\n

我想知道:\n如果@_在之前进行评估,shift则有一项太多,结果将无法正确。\n因此从概念上讲,必须shift首先执行。\n但是,在 C 中,他们告诉您永远不应该依赖于特定的顺序实际参数的评估(shift修改@_)。

\n

那么,该代码是否只能工作,因为@_它作为引用传递(以便能够更改它),并且shift之前被评估的代码splice可以访问@_

\n

一点历史

\n

我发现这个例子可以追溯到 1996 年(至少)和这本书(第 219 页;第 535 页的评论表明它甚至可能来自 Perl 4):

\n
\n

WALL、Larry、Tom CHRISTIANSEN 和 Randal L. SCHWARTZ,1996 年。Perl 编程。2. 塞瓦斯托波尔,CA 95472,美国:O\xe2\x80\x99Reilly & Associates, Inc. ISBN\xc2\xa01-56592-149-6

\n
\n

perl evaluation parameter-passing

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

stopifnot() 与 assertError()

我不知道之间的差别stopifnot()assertError()有:

assertError()默认情况下未找到(您必须首先加载“工具”包),但是stopifnot()

更重要的是, assertError() 总是会抛出错误消息,即使我传递了像TRUEor 之类的参数FALSE,而stopifnot()做明显和预期的事情。

阅读手册页没有帮助。而不是的正确用法是assertError(length(x) != 7)什么?如果x未定义,则语句不会产生错误,但是一旦定义,就会产生错误,与长度x(7 与否)无关。

r assertions

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

如何使用“使用严格”导入常量,避免“不能使用裸字......作为数组引用”

我在一个文件中有一个模块,它导出一个作为数组引用的常量。我可以在其定义模块中使用该常量,但在导入后无法使用它。错误消息说Can't use bareword ("AR") as an ARRAY ref while "strict refs" in use at mod.pl line 28.

考虑这个演示代码:

#!/usr/bin/perl
require 5.018_000;

use warnings;
use strict;

package Test;

use warnings;
use strict;

BEGIN {
    require Exporter;
    our $VERSION = 1.00;                # for version checking
    # Inherit from Exporter to export functions and variables
    our @ISA = qw(Exporter);
    our @EXPORT = qw();                 # exported by default
    our @EXPORT_OK = qw(AR);            # can be optionally exported
}

use constant AR => …
Run Code Online (Sandbox Code Playgroud)

import perl module reference constants

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