有没有什么好的方法可以在Java源代码中使用文本块(字符串)?许多其他语言都有heredoc语法可供他们使用,但Java没有.这使得处理诸如输出大量静态标记的标记库之类的东西以及需要断言与XML块的比较的单元测试非常不方便.
其他人如何解决这个问题?它甚至可能吗?或者我只是忍受它?
我需要通过here-doc将更多的多行文本放入PHP关联数组中.它看起来像这样:
$data = [
"x" => "y",
"foo" => "bar",
/* ... other values ... */
"idx" = <<< EOC
data data data data
data data data data
data data data data
EOC;
"z" => 9,
/* ... more values ... */
];
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何通过here-doc将元素"idx"与多行文本放在$ data数组中.
我有一个bash脚本,其命令我链接在一起&&,因为我希望脚本停止,如果单个步骤失败.
其中一个步骤基于heredoc创建配置文件:
some_command &&
some_command &&
some_command &&
some_command &&
some_command &&
some_command &&
cat > ./my-conf.yml <<-EOF
host: myhost.example.com
... blah blah ...
EOF
... lots more commands ...
Run Code Online (Sandbox Code Playgroud)
如何在&&链中包含此命令?我试过了:
&&在EOF之后立即放置.不起作用,因为EOF必须独立.&&按照EOF 放置在一条线上.不行,因为bash认为我正在尝试&&用作命令.&&在>重定向器之前.没有用,因为重定向器在逻辑上是命令的一部分&&.澄清:
在从heredoc生成配置文件的命令后面有很多(多行)命令,所以理想情况下我正在寻找一个允许我在heredoc之后放置以下命令的解决方案,这是脚本的自然流程.那就是我不希望在一行上内联20多个命令.
我已经用PHP开发了几年了,最近发现了这段代码:
<?php
echo <<<EOB
<html>
<head>
<title>My title</title>
</head>
...
EOB;
?>
Run Code Online (Sandbox Code Playgroud)
我从来没有见过这种打印HTML的方法,这似乎非常有用,并且不太容易出现一些奇怪的变量或双引号语法错误.
我已经搜索了一些关于此的官方信息,并且只找到了Rasmus谈论此事的帖子.
有关此功能的详细说明是什么,EOB是什么意思?可能结束了?
这有可能吗?怎么样?
更新:我需要这个,因为我从动态和静态数据创建了一个文件.
使用案例:我有一个测试目录.每个C文件生成一个测试可执行文件 同
SRCS = $(wildcard [a-z]*.c)
Run Code Online (Sandbox Code Playgroud)
我可以根据需要添加新的测试,make会找到新的测试,编译,运行和valgrind它们.我也用git.我.gitignore想要包含可执行文件.
所以那里.如何创建.gitignore和包含静态数据,即我想要忽略的文件(*.o和depend)以及动态可执行文件?
我想知道为什么我不能{number_format($row['my_number'])}在Heredoc里面做些什么.有没有办法解决这个问题,而不必诉诸于定义$myNumber下面的变量?
看了http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.nowdoc但什么也没找到.
码
foreach ($dbh -> query($sql) as $row):
$myNumber = number_format($row['my_number']);
$table .= <<<EOT
<tr>
<td>{$row['my_number']}</td> // WORKS
<td>$myNumber</td> // WORKS
<td>{number_format($row['my_number'])}</td> // DOES NOT WORK!
</tr>
EOT;
endforeach;
Run Code Online (Sandbox Code Playgroud) 是否有可能在另一个heredoc中写一个heredoc?
ssh -T -q yxz@server1 <<-"END_TEXT"
.
.
ssh -T -q abc@server2 <<-"SUB_TEXT"
.
.
SUB_TEXT
.
.
END_TEXT
Run Code Online (Sandbox Code Playgroud) 我喜欢HEREDOC语法,例如,生成的HTML的边缘情况,不值得放入模板.
但是,唯一令我烦恼的是,内容和heredoc字符串的结束标记符合第一列.这搞砸了嵌套的代码布局:
class myclass
{
function __construct()
{
$a = some_code();
$b = some_more_code();
$x = <<<EOT
line1
line2
line3
line4
EOT;
$c = even_more_code();
$b = still_more_code();
...
...
...
Run Code Online (Sandbox Code Playgroud)
你明白我的意思了.
现在使用正常的HEREDOC可能无法解决这个问题.有没有人解决这个问题?我的梦想是使用HEREDOC语法进行自动缩进.但我想如果不为源文件编写一些预编译器,这是不可能的.
我对么?
更新 -感谢所有回复.这个问题变得有些混乱,所以如果有人感兴趣,我就开始续集了.
我正在为朋友拼凑一个快速脚本,并偶然发现了一种在PHP中进行模板化的简单方法.
基本上,我们的想法是将html文档解析为heredoc字符串,因此PHP中的变量将被扩展.
passthrough函数允许在字符串中进行表达式求值和函数以及静态方法调用:
function passthrough($s){return $s;}
$_="passthrough";
Run Code Online (Sandbox Code Playgroud)
在heredoc字符串中解析文档的代码非常简单:
$t=file_get_contents('my_template.html');
eval("\$r=<<<_END_OF_FILE_\n$t\_END_OF_FILE_;\n");
echo $r;
Run Code Online (Sandbox Code Playgroud)
唯一的问题是,它使用eval.
任何人都可以想到一种方法来做这种模板而不使用eval,但没有添加解析器或大量的正则表达式疯狂?
没有编写完整的解析器,任何逃避不属于PHP变量的流浪美元符号的建议?流浪的美元符号问题是否会使这种方法不适合"严重"使用?
这是一些模板化的HTML代码示例.
<script>var _lang = {$_(json_encode($lang))};</script>
<script src='/blah.js'></script>
<link href='/blah.css' type='text/css' rel='stylesheet'>
<form class="inquiry" method="post" action="process.php" onsubmit="return validate(this)">
<div class="filter">
<h2>
{$lang['T_FILTER_TITLE']}
</h2>
<a href='#{$lang['T_FILTER_ALL']}' onclick='applyFilter();'>
{$lang['T_FILTER_ALL']}
</a>
{$filter_html}
</div>
<table class="inventory" id="inventory_table">
{$table_rows}
<tr class="static"><th colspan="{$_($cols+1)}">
{$lang['T_FORM_HELP']}
</th></tr>
{$form_fields}
<tr class="static">
<td id="validation" class="send" colspan="{$cols}"> </td>
<td colspan="1" class="send"><input type="submit" value="{$lang['T_SEND']}" /></td>
</tr>
</table>
</form>
Run Code Online (Sandbox Code Playgroud)
我试图在Bash脚本中运行一些Python代码,所以我想了解之间的区别是什么:
#!/bin/bash
#your bash code
python -c "
#your py code
"
Run Code Online (Sandbox Code Playgroud)
VS
python - <<DOC
#your py code
DOC
Run Code Online (Sandbox Code Playgroud)
我检查了网络,但无法编译主题周围的位.你认为一个比另一个好吗?如果你想从Python代码块返回一个值到你的Bash脚本,那么heredoc是唯一的方法吗?