Подумайте об этом так: он всегда проходит по значению. Однако значение объекта не является самим объектом, а ссылкой на этот объект.
Вот пример, передающий число (примитивный тип)
function changePrimitive(val) {
// At this point there are two '10's in memory.
// Changing one won't affect the other
val = val * 10;
}
var x = 10;
changePrimitive(x);
// x === 10
Повторение этого с объектом дает разные результаты:
function changeObject(obj) {
// At this point there are two references (x and obj) in memory,
// but these both point to the same object.
// changing the object will change the underlying object that
// x and obj both hold a reference to.
obj.val = obj.val * 10;
}
var x = { val: 10 };
changeObject(x);
// x === { val: 100 }
One еще пример:
function changeObject(obj) {
// Again there are two references (x and obj) in memory,
// these both point to the same object.
// now we create a completely new object and assign it.
// obj's reference now points to the new object.
// x's reference doesn't change.
obj = { val: 100 };
}
var x = { val: 10 };
changeObject(x);
// x === { val: 10}
Вы можете использовать backtics для выполнения вашей внешней программы и захвата ее stdout
и stderr
.
По умолчанию обратные выходы отбрасывают stderr
и возвращают только stdout
внешней программы. Так
$output = `cmd`;
Удерживает stdout
программы cmd и discard stderr
.
Чтобы записать только stderr
, вы можете использовать дескрипторы файла оболочки как:
$output = `cmd 2>&1 1>/dev/null`;
Чтобы захватить как stdout
, так и stderr
, вы можете сделать :
$output = `cmd 2>&1`;
Используя вышеизложенное, вы не сможете различать stderr
с stdout
. Для separte stdout
из stderr
можно перенаправить оба файла в отдельный файл и прочитать файлы:
`cmd 1>stdout.txt 2>stderr.txt`;
Вы можете использовать IPC :: Open3 или IPC :: Run . Кроме того, прочитайте . Как я могу захватить STDERR из внешней команды из perlfaq8 .
В большинстве случаев вы можете использовать оператор qx//
(или backticks). Он интерполирует строки и выполняет их с оболочкой, поэтому вы можете использовать перенаправления.
$output = `cmd`;
$output = `cmd 2>&1`;
$output = `cmd 2>&1 1>/dev/null`;
$output = `cmd 3>&1 1>&2 2>&3 3>&-`;
system("program args 1>program.stdout 2>program.stderr");
cmd 2>&1 1>/dev/null
убивает как stdout, так и stderr. Так или иначе оболочка не идентифицирует, что два перенаправления разделены! – L__ 11 April 2016 в 16:27